diff --git a/AY2324S2-CS2103-F08-1_tp_master/authorship.json b/AY2324S2-CS2103-F08-1_tp_master/authorship.json index 5dd16d03..af26fd80 100644 --- a/AY2324S2-CS2103-F08-1_tp_master/authorship.json +++ b/AY2324S2-CS2103-F08-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F08-1/tp/actions)","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F08-1/tp/graph/badge.svg?token\u003d15QKN9GAV0)](https://codecov.io/gh/AY2324S2-CS2103-F08-1/tp)","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"sethteo"},"content":"## FinCliQ, the one-stop client management application for Financial Advisors.","lastModifiedDate":"2024-02-26"},{"lineNumber":5,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"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":"sethteo"},"content":"### About the App","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* The app allows Financial Advisors to keep track of the clients under them as well as the scheduled meeting with their clients.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"sethteo"},"content":" * It is **written in OOP fashion** and provides a **reasonably well-written** code base.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"sethteo"},"content":"* Example usages:","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"sethteo"},"content":" * Allows Financial Advisors to add new clients, delete existing clients","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"sethteo"},"content":" * Allows Financial Advisors to create meetings with existing clients","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"sethteo"},"content":" * Allows Financial Advisors to delete meetings with existing clients","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"sethteo"},"content":"* We hope that through FinCliQ we can help Financial Advisors achieve financial freedom for all their customers by","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"sethteo"},"content":"* providing an easy way to keep track of all clients and the meetings with them.","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"sethteo"},"content":"### Acknowledgements","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"sethteo"},"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":{"sethteo":15,"itstrueitstrueitsrealitsreal":2,"-":5}},{"path":"bin/main/view/CommandBox.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.TextField?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cStackPane styleClass\u003d\"stack-pane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cTextField fx:id\u003d\"commandTextField\" onAction\u003d\"#handleCommandEntered\" promptText\u003d\"Enter command here...\"/\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":9}},{"path":"bin/main/view/DarkTheme.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".background {","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" background-color: #383838; /* Used in the default.html file */","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".label {","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #555555;","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".label-bright {","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".label-header {","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 32pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".text-field {","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 12pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tab-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tab-pane .tab-header-area {","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-min-height: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-max-height: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view {","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-base: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-control-inner-background: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-table-cell-border-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-table-header-border-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":48,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 5;","lastModifiedDate":"2024-02-27"},{"lineNumber":49,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view .column-header-background {","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view .column-header, .table-view .filler {","lastModifiedDate":"2024-02-27"},{"lineNumber":56,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-size: 35;","lastModifiedDate":"2024-02-27"},{"lineNumber":57,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 0 0 1 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":58,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":59,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color:","lastModifiedDate":"2024-02-27"},{"lineNumber":60,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" transparent","lastModifiedDate":"2024-02-27"},{"lineNumber":61,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" transparent","lastModifiedDate":"2024-02-27"},{"lineNumber":62,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" derive(-fx-base, 80%)","lastModifiedDate":"2024-02-27"},{"lineNumber":63,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":64,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-insets: 0 10 1 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":65,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":66,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":67,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view .column-header .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":68,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 20pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":69,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":70,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":71,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-alignment: center-left;","lastModifiedDate":"2024-02-27"},{"lineNumber":72,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":73,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":74,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":75,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view:focused .table-row-cell:filled:focused:selected {","lastModifiedDate":"2024-02-27"},{"lineNumber":76,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-02-27"},{"lineNumber":77,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":78,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":79,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".split-pane:horizontal .split-pane-divider {","lastModifiedDate":"2024-02-27"},{"lineNumber":80,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":81,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: transparent transparent transparent #4d4d4d;","lastModifiedDate":"2024-02-27"},{"lineNumber":82,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":83,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":84,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".split-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":85,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":86,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":87,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":88,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":89,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":90,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-view {","lastModifiedDate":"2024-02-27"},{"lineNumber":91,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":92,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":93,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":94,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":95,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":96,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell {","lastModifiedDate":"2024-02-27"},{"lineNumber":97,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-label-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":98,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-graphic-text-gap : 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":99,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":100,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":101,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":102,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:even {","lastModifiedDate":"2024-02-27"},{"lineNumber":103,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #3c3e3f;","lastModifiedDate":"2024-02-27"},{"lineNumber":104,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":105,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":106,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:odd {","lastModifiedDate":"2024-02-27"},{"lineNumber":107,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #515658;","lastModifiedDate":"2024-02-27"},{"lineNumber":108,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":109,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":110,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:selected {","lastModifiedDate":"2024-02-27"},{"lineNumber":111,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #424d5f;","lastModifiedDate":"2024-02-27"},{"lineNumber":112,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":113,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":114,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:selected #cardPane {","lastModifiedDate":"2024-02-27"},{"lineNumber":115,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: #3e7b91;","lastModifiedDate":"2024-02-27"},{"lineNumber":116,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":117,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":118,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":119,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":120,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":121,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":122,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":123,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".cell_big_label {","lastModifiedDate":"2024-02-27"},{"lineNumber":124,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":125,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 16px;","lastModifiedDate":"2024-02-27"},{"lineNumber":126,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-02-27"},{"lineNumber":127,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":128,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":129,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".cell_small_label {","lastModifiedDate":"2024-02-27"},{"lineNumber":130,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI\";","lastModifiedDate":"2024-02-27"},{"lineNumber":131,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 13px;","lastModifiedDate":"2024-02-27"},{"lineNumber":132,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-02-27"},{"lineNumber":133,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":134,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":135,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".stack-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":136,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":137,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":138,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":139,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".pane-with-border {","lastModifiedDate":"2024-02-27"},{"lineNumber":140,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":141,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: derive(#1d1d1d, 10%);","lastModifiedDate":"2024-02-27"},{"lineNumber":142,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-top-width: 1px;","lastModifiedDate":"2024-02-27"},{"lineNumber":143,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":144,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":145,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar {","lastModifiedDate":"2024-02-27"},{"lineNumber":146,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":147,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":148,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":149,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".result-display {","lastModifiedDate":"2024-02-27"},{"lineNumber":150,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":151,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":152,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":153,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":154,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":155,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":156,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".result-display .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":157,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: black !important;","lastModifiedDate":"2024-02-27"},{"lineNumber":158,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":159,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":160,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":161,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":162,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":163,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 4px;","lastModifiedDate":"2024-02-27"},{"lineNumber":164,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-pref-height: 30px;","lastModifiedDate":"2024-02-27"},{"lineNumber":165,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":166,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":167,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar-with-border {","lastModifiedDate":"2024-02-27"},{"lineNumber":168,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":169,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-02-27"},{"lineNumber":170,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-02-27"},{"lineNumber":171,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":172,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":173,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar-with-border .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":174,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":175,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":176,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":177,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".grid-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":178,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":179,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":180,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-02-27"},{"lineNumber":181,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":182,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":183,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".grid-pane .stack-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":184,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":185,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":186,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":187,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".context-menu {","lastModifiedDate":"2024-02-27"},{"lineNumber":188,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-02-27"},{"lineNumber":189,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":190,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":191,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".context-menu .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":192,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":193,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":194,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":195,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".menu-bar {","lastModifiedDate":"2024-02-27"},{"lineNumber":196,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":197,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":198,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":199,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".menu-bar .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":200,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 14pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":201,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":202,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":203,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-02-27"},{"lineNumber":204,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":205,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":206,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".menu .left-container {","lastModifiedDate":"2024-02-27"},{"lineNumber":207,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: black;","lastModifiedDate":"2024-02-27"},{"lineNumber":208,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":209,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":210,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"/*","lastModifiedDate":"2024-02-27"},{"lineNumber":211,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Metro style Push Button","lastModifiedDate":"2024-02-27"},{"lineNumber":212,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Author: Pedro Duque Vieira","lastModifiedDate":"2024-02-27"},{"lineNumber":213,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * http://pixelduke.wordpress.com/2012/10/23/jmetro-windows-8-controls-on-java/","lastModifiedDate":"2024-02-27"},{"lineNumber":214,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" */","lastModifiedDate":"2024-02-27"},{"lineNumber":215,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button {","lastModifiedDate":"2024-02-27"},{"lineNumber":216,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 5 22 5 22;","lastModifiedDate":"2024-02-27"},{"lineNumber":217,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: #e2e2e2;","lastModifiedDate":"2024-02-27"},{"lineNumber":218,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":219,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":220,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":221,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI\", Helvetica, Arial, sans-serif;","lastModifiedDate":"2024-02-27"},{"lineNumber":222,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":223,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #d8d8d8;","lastModifiedDate":"2024-02-27"},{"lineNumber":224,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 0 0 0 0, 0, 1, 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":225,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":226,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":227,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:hover {","lastModifiedDate":"2024-02-27"},{"lineNumber":228,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #3a3a3a;","lastModifiedDate":"2024-02-27"},{"lineNumber":229,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":230,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":231,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:pressed, .button:default:hover:pressed {","lastModifiedDate":"2024-02-27"},{"lineNumber":232,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":233,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":234,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":235,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":236,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:focused {","lastModifiedDate":"2024-02-27"},{"lineNumber":237,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: white, white;","lastModifiedDate":"2024-02-27"},{"lineNumber":238,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1, 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":239,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-style: solid, segments(1, 1);","lastModifiedDate":"2024-02-27"},{"lineNumber":240,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 0, 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":241,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-insets: 1 1 1 1, 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":242,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":243,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":244,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:disabled, .button:default:disabled {","lastModifiedDate":"2024-02-27"},{"lineNumber":245,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 0.4;","lastModifiedDate":"2024-02-27"},{"lineNumber":246,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":247,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":248,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":249,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":250,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:default {","lastModifiedDate":"2024-02-27"},{"lineNumber":251,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-02-27"},{"lineNumber":252,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #ffffff;","lastModifiedDate":"2024-02-27"},{"lineNumber":253,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":254,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":255,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:default:hover {","lastModifiedDate":"2024-02-27"},{"lineNumber":256,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(-fx-focus-color, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":257,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":258,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":259,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":260,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":261,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":262,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":263,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane \u003e *.button-bar \u003e *.container {","lastModifiedDate":"2024-02-27"},{"lineNumber":264,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":265,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":266,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":267,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane \u003e *.label.content {","lastModifiedDate":"2024-02-27"},{"lineNumber":268,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 14px;","lastModifiedDate":"2024-02-27"},{"lineNumber":269,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-weight: bold;","lastModifiedDate":"2024-02-27"},{"lineNumber":270,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":271,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":272,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":273,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane:header *.header-panel {","lastModifiedDate":"2024-02-27"},{"lineNumber":274,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-02-27"},{"lineNumber":275,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":276,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":277,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane:header *.header-panel *.label {","lastModifiedDate":"2024-02-27"},{"lineNumber":278,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 18px;","lastModifiedDate":"2024-02-27"},{"lineNumber":279,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-style: italic;","lastModifiedDate":"2024-02-27"},{"lineNumber":280,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":281,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":282,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":283,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":284,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar {","lastModifiedDate":"2024-02-27"},{"lineNumber":285,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":286,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":287,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":288,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar .thumb {","lastModifiedDate":"2024-02-27"},{"lineNumber":289,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-02-27"},{"lineNumber":290,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":291,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":292,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":293,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar .increment-button, .scroll-bar .decrement-button {","lastModifiedDate":"2024-02-27"},{"lineNumber":294,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":295,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":296,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":297,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar .increment-arrow, .scroll-bar .decrement-arrow {","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-shape: \" \";","lastModifiedDate":"2024-02-27"},{"lineNumber":300,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":301,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":302,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar:vertical .increment-arrow, .scroll-bar:vertical .decrement-arrow {","lastModifiedDate":"2024-02-27"},{"lineNumber":303,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 1 8 1 8;","lastModifiedDate":"2024-02-27"},{"lineNumber":304,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":305,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":306,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar:horizontal .increment-arrow, .scroll-bar:horizontal .decrement-arrow {","lastModifiedDate":"2024-02-27"},{"lineNumber":307,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 8 1 8 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":308,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":309,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":310,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#cardPane {","lastModifiedDate":"2024-02-27"},{"lineNumber":311,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":312,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":313,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":314,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":315,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#commandTypeLabel {","lastModifiedDate":"2024-02-27"},{"lineNumber":316,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11px;","lastModifiedDate":"2024-02-27"},{"lineNumber":317,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #F70D1A;","lastModifiedDate":"2024-02-27"},{"lineNumber":318,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":319,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":320,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#commandTextField {","lastModifiedDate":"2024-02-27"},{"lineNumber":321,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent #383838 transparent #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":322,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":323,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: #383838 #383838 #ffffff #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":324,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-insets: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":325,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":326,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":327,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":328,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":329,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":330,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":331,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#filterField, #personListPanel, #personWebpage {","lastModifiedDate":"2024-02-27"},{"lineNumber":332,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-effect: innershadow(gaussian, black, 10, 0, 0, 0);","lastModifiedDate":"2024-02-27"},{"lineNumber":333,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":334,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":335,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#resultDisplay .content {","lastModifiedDate":"2024-02-27"},{"lineNumber":336,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent, #383838, transparent, #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":337,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":338,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":339,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":340,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#tags {","lastModifiedDate":"2024-02-27"},{"lineNumber":341,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-hgap: 7;","lastModifiedDate":"2024-02-27"},{"lineNumber":342,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-vgap: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":343,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":344,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":345,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#tags .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":346,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":347,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #3e7b91;","lastModifiedDate":"2024-02-27"},{"lineNumber":348,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 1 3 1 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":349,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":350,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":351,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11;","lastModifiedDate":"2024-02-27"},{"lineNumber":352,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":352}},{"path":"bin/main/view/Extensions.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".error {","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #d06651 !important; /* The error class should always override the default text-fill style */","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:empty {","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" /* Empty cells will not have alternating colours */","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background: #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tag-selector {","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tooltip-text {","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":20}},{"path":"bin/main/view/HelpWindow.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton, #helpMessage {","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton {","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: dimgray;","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton:hover {","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: gray;","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton:armed {","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: darkgray;","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#helpMessageContainer {","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":19}},{"path":"bin/main/view/HelpWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Button?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.stage.Stage?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cfx:root resizable\u003d\"false\" title\u003d\"Help\" type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cImage url\u003d\"@/images/help_icon.png\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cURL value\u003d\"@HelpWindow.css\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox alignment\u003d\"CENTER\" fx:id\u003d\"helpMessageContainer\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cchildren\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"helpMessage\" text\u003d\"Label\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets right\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cButton fx:id\u003d\"copyButton\" mnemonicParsing\u003d\"false\" onAction\u003d\"#copyUrl\" text\u003d\"Copy URL\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets left\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Button\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/children\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003copaqueInsets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/opaqueInsets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":44}},{"path":"bin/main/view/MainWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Menu?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.MenuBar?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.MenuItem?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.SplitPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cfx:root type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" title\u003d\"Address App\" minWidth\u003d\"450\" minHeight\u003d\"600\" onCloseRequest\u003d\"#handleExit\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cImage url\u003d\"@/images/address_book_32.png\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cURL value\u003d\"@DarkTheme.css\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cURL value\u003d\"@Extensions.css\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cVBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenuBar fx:id\u003d\"menuBar\" VBox.vgrow\u003d\"NEVER\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"File\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenuItem mnemonicParsing\u003d\"false\" onAction\u003d\"#handleExit\" text\u003d\"Exit\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"Help\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenuItem fx:id\u003d\"helpMenuItem\" mnemonicParsing\u003d\"false\" onAction\u003d\"#handleHelp\" text\u003d\"Help\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/MenuBar\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"commandBoxPlaceholder\" styleClass\u003d\"pane-with-border\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"resultDisplayPlaceholder\" styleClass\u003d\"pane-with-border\"","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" minHeight\u003d\"100\" prefHeight\u003d\"100\" maxHeight\u003d\"100\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":48,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":49,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cVBox fx:id\u003d\"personList\" styleClass\u003d\"pane-with-border\" minWidth\u003d\"340\" prefWidth\u003d\"340\" VBox.vgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"10\" right\u003d\"10\" bottom\u003d\"10\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane fx:id\u003d\"personListPanelPlaceholder\" VBox.vgrow\u003d\"ALWAYS\"/\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":56,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane fx:id\u003d\"statusbarPlaceholder\" VBox.vgrow\u003d\"NEVER\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":57,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":58,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":59,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":60,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":60}},{"path":"bin/main/view/PersonListCard.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"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":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cFlowPane fx:id\u003d\"tags\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":36}},{"path":"bin/main/view/PersonListPanel.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.ListView?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cVBox xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cListView fx:id\u003d\"personListView\" VBox.vgrow\u003d\"ALWAYS\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/VBox\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":8}},{"path":"bin/main/view/ResultDisplay.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.TextArea?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cStackPane fx:id\u003d\"placeHolder\" styleClass\u003d\"pane-with-border\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cTextArea fx:id\u003d\"resultDisplay\" editable\u003d\"false\" styleClass\u003d\"result-display\"/\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":9}},{"path":"bin/main/view/StatusBarFooter.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cGridPane styleClass\u003d\"status-bar\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"saveLocationStatus\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/GridPane\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":12}},{"path":"bin/test/view/UiPartTest/invalidFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"Not a valid FXML file","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":1}},{"path":"bin/test/view/UiPartTest/validFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import seedu.address.ui.TestFxmlObject?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cTestFxmlObject xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:id\u003d\"validFileRoot\"\u003eHello World!\u003c/TestFxmlObject\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":4}},{"path":"bin/test/view/UiPartTest/validFileWithFxRoot.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cfx:root type\u003d\"seedu.address.ui.TestFxmlObject\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003ctext\u003eHello World!\u003c/text\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":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":"jaejayrome"},"content":"### Jerome Goh","lastModifiedDate":"2024-03-03"},{"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":"jaejayrome"},"content":"[[github](https://github.com/jaejayrome)]","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"jaejayrome"},"content":"- Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"jaejayrome"},"content":"- Responsibilities: Model","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"timothysashimi"},"content":"### Timothy Chan","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"sethteo"},"content":"\u003cimg src\u003d\"images/timothysashimi.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"timothysashimi"},"content":"[[github](http://github.com/timothysashimi)]","lastModifiedDate":"2024-03-01"},{"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":"timothysashimi"},"content":"- Role: Developer","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"chewbum"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Kenneth Seet","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cimg src\u003d\"images/itstrueitstrueitsrealitsreal.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[[github](http://github.com/itstrueitstrueitsrealitsreal)] [[portfolio](team/kenneth.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"chewbum"},"content":"- Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"chewbum"},"content":"- Responsibilities: Project Management","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"sethteo"},"content":"### Teo Hong Rui","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"sethteo"},"content":"\u003cimg src\u003d\"images/sethteo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"sethteo"},"content":"[[github](https://github.com/sethteo)]","lastModifiedDate":"2024-02-27"},{"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":"chewbum"},"content":"- Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"chewbum"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Chew Zi Xuan","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chewbum"},"content":"\u003cimg src\u003d\"images/chewbum.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"chewbum"},"content":"[[github](http://github.com/chewbum)]","lastModifiedDate":"2024-02-28"},{"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":"chewbum"},"content":"- Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"chewbum"},"content":"- Responsibilities: Model","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"timothysashimi":3,"sethteo":4,"chewbum":9,"-":35,"itstrueitstrueitsrealitsreal":4,"jaejayrome":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":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"chewbum"},"content":"- Table of Contents","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"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":"chewbum"},"content":"- {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"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":28,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"chewbum"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"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":42,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"chewbum"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"chewbum"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"chewbum"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"chewbum"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"chewbum"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"chewbum"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"chewbum"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"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":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"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":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"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":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"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":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"chewbum"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-04"},{"lineNumber":85,"author":{"gitId":"chewbum"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-04"},{"lineNumber":86,"author":{"gitId":"chewbum"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-04"},{"lineNumber":87,"author":{"gitId":"chewbum"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-04"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"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":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"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":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"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":102,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"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":107,"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":108,"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":109,"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":110,"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":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":112,"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":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":118,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":119,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":122,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":123,"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":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"chewbum"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-04"},{"lineNumber":130,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":131,"author":{"gitId":"chewbum"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-04"},{"lineNumber":132,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":134,"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":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"\u003c/div\u003e","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":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"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":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":148,"author":{"gitId":"chewbum"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-04"},{"lineNumber":149,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":150,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"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":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"chewbum"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-04"},{"lineNumber":169,"author":{"gitId":"chewbum"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"chewbum"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-04"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"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":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"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":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"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":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"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":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"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":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"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":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"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":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"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":197,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"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":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":211,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":213,"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":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"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":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"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":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"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":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"chewbum"},"content":"- **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2024-03-04"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"chewbum"},"content":" - Pros: Easy to implement.","lastModifiedDate":"2024-03-04"},{"lineNumber":238,"author":{"gitId":"chewbum"},"content":" - Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2024-03-04"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":240,"author":{"gitId":"chewbum"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-04"},{"lineNumber":241,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"chewbum"},"content":" - Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2024-03-04"},{"lineNumber":243,"author":{"gitId":"chewbum"},"content":" - Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2024-03-04"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"chewbum"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":256,"author":{"gitId":"chewbum"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":257,"author":{"gitId":"chewbum"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":258,"author":{"gitId":"chewbum"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":259,"author":{"gitId":"chewbum"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"chewbum"},"content":"- has a need to manage a significant number of clients","lastModifiedDate":"2024-03-04"},{"lineNumber":270,"author":{"gitId":"chewbum"},"content":"- has a need to manage a significant number of meetings","lastModifiedDate":"2024-03-04"},{"lineNumber":271,"author":{"gitId":"chewbum"},"content":"- has a need to classify clients into different categories","lastModifiedDate":"2024-03-04"},{"lineNumber":272,"author":{"gitId":"chewbum"},"content":"- prefers desktop apps over other types of apps","lastModifiedDate":"2024-03-04"},{"lineNumber":273,"author":{"gitId":"chewbum"},"content":"- can type fast (50 wpm or more)","lastModifiedDate":"2024-03-04"},{"lineNumber":274,"author":{"gitId":"chewbum"},"content":"- prefers typing to mouse interactions","lastModifiedDate":"2024-03-04"},{"lineNumber":275,"author":{"gitId":"chewbum"},"content":"- is reasonably comfortable using CLI apps","lastModifiedDate":"2024-03-04"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"**Value proposition**: A CLI designed specifically for financial advisors to revolutionise the way they manage, schedule, filter and rank their clients. Addresses the day-to-day challenges faced by financial advisors but also provides strategic value through its ranking and leaderboard features. It\u0027s a companion that empowers financial advisors to scale to new heights.","lastModifiedDate":"2024-03-02"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"chewbum"},"content":"| -------- | ---------------------- | ------------------------------------ | ------------------------------------------ |","lastModifiedDate":"2024-03-04"},{"lineNumber":285,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | add new clients profiles to my list | keep track of the clients under me |","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | edit the profiles of my clients | keep their information up to date |","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | delete the clients under me | remove clients that are no longer under me |","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | view all my client profiles | track all my clients in one place |","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | add client meetings | keep track of my schedule |","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | view upcoming meetings | so I can prepare for them accordingly |","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"sethteo"},"content":"| `* *` | As a financial advisor | search my meetings by date or agenda | locate meetings with specific filters |","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"sethteo"},"content":"| `* *` | As a financial advisor | filter my meetings by date | so I can know the meetings of that day |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"sethteo"},"content":"| `*` | As a financial advisor | sort persons by name | locate a person easily |","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"chewbum"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-04"},{"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":"jaejayrome"},"content":"(For all use cases below, the **System** is the `FinCliQ` and the **Actor** is the `targeted financial advisor`, unless specified otherwise)","lastModifiedDate":"2024-03-03"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Add New Client Profiles**","lastModifiedDate":"2024-03-03"},{"lineNumber":304,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":305,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to add a new client profile to their list.","lastModifiedDate":"2024-03-03"},{"lineNumber":306,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog adds the new client profile to the advisor\u0027s list.","lastModifiedDate":"2024-03-03"},{"lineNumber":307,"author":{"gitId":"jaejayrome"},"content":"3. ClientCatalog confirms the successful addition of the client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":308,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":309,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":310,"author":{"gitId":"jaejayrome"},"content":"**Extensions:**","lastModifiedDate":"2024-03-03"},{"lineNumber":311,"author":{"gitId":"jaejayrome"},"content":"- 1a. The financial advisor does not provide necessary client information.","lastModifiedDate":"2024-03-03"},{"lineNumber":312,"author":{"gitId":"jaejayrome"},"content":" - 1a1. ClientCatalog detects missing information.","lastModifiedDate":"2024-03-03"},{"lineNumber":313,"author":{"gitId":"jaejayrome"},"content":" - 1a2. ClientCatalog prompts the financial advisor to provide the missing information.","lastModifiedDate":"2024-03-03"},{"lineNumber":314,"author":{"gitId":"jaejayrome"},"content":" - Use case resumes from step 1.","lastModifiedDate":"2024-03-03"},{"lineNumber":315,"author":{"gitId":"jaejayrome"},"content":"- 1b. The financial advisor attempts to add a client profile that already exists.","lastModifiedDate":"2024-03-03"},{"lineNumber":316,"author":{"gitId":"jaejayrome"},"content":" - 1b1. ClientCatalog detects duplicate profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":317,"author":{"gitId":"jaejayrome"},"content":" - 1b2. ClientCatalog notifies the financial advisor about the existing profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":318,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":319,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":320,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Edit Client Profiles**","lastModifiedDate":"2024-03-03"},{"lineNumber":321,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":322,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to edit the profile of a client.","lastModifiedDate":"2024-03-03"},{"lineNumber":323,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog retrieves the client\u0027s profile for editing.","lastModifiedDate":"2024-03-03"},{"lineNumber":324,"author":{"gitId":"jaejayrome"},"content":"3. Financial advisor updates the necessary information.","lastModifiedDate":"2024-03-03"},{"lineNumber":325,"author":{"gitId":"jaejayrome"},"content":"4. ClientCatalog saves the changes to the client\u0027s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":326,"author":{"gitId":"jaejayrome"},"content":"5. ClientCatalog confirms the successful update of the client\u0027s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":327,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":328,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":329,"author":{"gitId":"jaejayrome"},"content":"**Extensions:**","lastModifiedDate":"2024-03-03"},{"lineNumber":330,"author":{"gitId":"jaejayrome"},"content":"- 1a. The financial advisor tries to edit a non-existent client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":331,"author":{"gitId":"jaejayrome"},"content":" - 1a1. ClientCatalog detects the absence of the client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":332,"author":{"gitId":"jaejayrome"},"content":" - 1a2. ClientCatalog notifies the financial advisor about the non-existence of the client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":333,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":334,"author":{"gitId":"jaejayrome"},"content":"- 1b. The financial advisor attempts to edit the profile with invalid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":335,"author":{"gitId":"jaejayrome"},"content":" - 1b1. ClientCatalog detects invalid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":336,"author":{"gitId":"jaejayrome"},"content":" - 1b2. ClientCatalog prompts the financial advisor to provide valid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":337,"author":{"gitId":"jaejayrome"},"content":" - Use case resumes from step 3.","lastModifiedDate":"2024-03-03"},{"lineNumber":338,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":339,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Delete Clients**","lastModifiedDate":"2024-03-03"},{"lineNumber":340,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":341,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to delete a client from their list.","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog removes the specified client from the advisor\u0027s list.","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"jaejayrome"},"content":"3. ClientCatalog confirms the successful deletion of the client.","lastModifiedDate":"2024-03-03"},{"lineNumber":344,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":345,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":346,"author":{"gitId":"jaejayrome"},"content":"**Extensions:**","lastModifiedDate":"2024-03-03"},{"lineNumber":347,"author":{"gitId":"jaejayrome"},"content":"- 1a. The financial advisor tries to delete a non-existent client.","lastModifiedDate":"2024-03-03"},{"lineNumber":348,"author":{"gitId":"jaejayrome"},"content":" - 1a1. ClientCatalog detects the absence of the client.","lastModifiedDate":"2024-03-03"},{"lineNumber":349,"author":{"gitId":"jaejayrome"},"content":" - 1a2. ClientCatalog notifies the financial advisor about the non-existence of the client.","lastModifiedDate":"2024-03-03"},{"lineNumber":350,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":351,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":352,"author":{"gitId":"jaejayrome"},"content":"**Use Case: View All Client Profiles**","lastModifiedDate":"2024-03-03"},{"lineNumber":353,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":354,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to view all client profiles.","lastModifiedDate":"2024-03-03"},{"lineNumber":355,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog retrieves and displays all client profiles associated with the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Add Client Meetings**","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to add a meeting with a client to their schedule.","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler schedules the meeting with the specified client.","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"jaejayrome"},"content":"3. MeetingScheduler confirms the successful addition of the meeting to the advisor\u0027s schedule.","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"jaejayrome"},"content":"**Use Case: View Upcoming Meetings**","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to view all upcoming meetings.","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler retrieves and displays all upcoming meetings scheduled for the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Search Meetings by Date or Agenda**","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to search for meetings based on date or agenda.","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler filters meetings based on the specified date or agenda.","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"jaejayrome"},"content":"3. MeetingScheduler displays the filtered meetings to the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Filter Meetings by Date**","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to filter meetings by date.","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler filters meetings based on the specified date.","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"jaejayrome"},"content":"3. MeetingScheduler displays the filtered meetings to the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":385,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Sort Persons by Name**","lastModifiedDate":"2024-03-03"},{"lineNumber":386,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":387,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to sort persons by name.","lastModifiedDate":"2024-03-03"},{"lineNumber":388,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog sorts the list of persons alphabetically by name.","lastModifiedDate":"2024-03-03"},{"lineNumber":389,"author":{"gitId":"jaejayrome"},"content":"3. ClientCatalog displays the sorted list to the financial advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":390,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"chewbum"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"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":397,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for","lastModifiedDate":"2024-02-27"},{"lineNumber":398,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" typical usage.","lastModifiedDate":"2024-02-27"},{"lineNumber":399,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. Should be able to hold up to 10 meetings per client without a noticeable sluggishness in","lastModifiedDate":"2024-02-27"},{"lineNumber":400,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" performance for typical usage.","lastModifiedDate":"2024-02-27"},{"lineNumber":401,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. A user with above average typing speed for regular English text (i.e. not code, not system","lastModifiedDate":"2024-02-27"},{"lineNumber":402,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-02-27"},{"lineNumber":403,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. A user should be able to use the system without much guidance.","lastModifiedDate":"2024-02-27"},{"lineNumber":404,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. The application should only require a standalone executable file to run. No other software should be required to be installed.","lastModifiedDate":"2024-02-27"},{"lineNumber":405,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. The system should respond within 3 seconds to ensure smooth user experience.","lastModifiedDate":"2024-02-27"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"chewbum"},"content":"- **Financial Advisor (FA)**: A user of the FinCliq app who provides financial advice and services to clients.","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"chewbum"},"content":"- **Client**: An individual who seeks financial advice and potentially uses the services of a user of the FinCliq platform.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"chewbum"},"content":"- **Meeting**: A scheduled interaction between a Financial Advisor and a Client. Can be virtual or in-person.","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"chewbum"},"content":"- **Meeting Notes**: Textual records or summaries of discussions and decisions made during a meeting.","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"chewbum"},"content":"- **Use Case**: A description of a specific user goal or task and the steps required to achieve it.","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"chewbum"},"content":"- **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"chewbum"},"content":"- **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"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":{"sethteo":9,"chewbum":68,"-":292,"itstrueitstrueitsrealitsreal":10,"jaejayrome":89}},{"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":"chewbum"},"content":"- Table of Contents","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":" - `list` : Lists all contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chewbum"},"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":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"chewbum"},"content":" - `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chewbum"},"content":" - `clear` : Deletes all contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"chewbum"},"content":" - `exit` : Exits the app.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"## Client Functions","lastModifiedDate":"2024-02-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"chewbum"},"content":"### Adding a client: `add`","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"chewbum"},"content":"Adds a client to the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"chewbum"},"content":"A client can have any number of tags (including 0)","lastModifiedDate":"2024-02-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"chewbum"},"content":"- `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2024-02-29"},{"lineNumber":89,"author":{"gitId":"chewbum"},"content":"- `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2024-02-29"},{"lineNumber":90,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":91,"author":{"gitId":"chewbum"},"content":"### Listing all clients : `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"chewbum"},"content":"Shows a list of all clients in the address book.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"### Editing a client : `edit`","lastModifiedDate":"2024-02-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"chewbum"},"content":"Edits an existing client in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"chewbum"},"content":"- Edits the client at the specified `INDEX`. The index refers to the index number shown in the displayed client list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"chewbum"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"chewbum"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"chewbum"},"content":"- When editing tags, the existing tags of the client will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"chewbum"},"content":"- You can remove all the client’s tags by typing `t/` without","lastModifiedDate":"2024-02-29"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"chewbum"},"content":"- `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st client to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"chewbum"},"content":"- `edit 2 n/Betsy Crower t/` Edits the name of the 2nd client to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"chewbum"},"content":"### Locating clients by name: `find`","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"chewbum"},"content":"- The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2024-02-29"},{"lineNumber":122,"author":{"gitId":"chewbum"},"content":"- The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"chewbum"},"content":"- Only the name is searched.","lastModifiedDate":"2024-02-29"},{"lineNumber":124,"author":{"gitId":"chewbum"},"content":"- Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"chewbum"},"content":"- Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"chewbum"},"content":"- `find John` returns `john` and `John Doe`","lastModifiedDate":"2024-02-29"},{"lineNumber":131,"author":{"gitId":"chewbum"},"content":"- `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"### Deleting a client : `delete`","lastModifiedDate":"2024-02-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"chewbum"},"content":"Deletes the specified client from the address book.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Deletes the client at the specified `INDEX`.","lastModifiedDate":"2024-02-29"},{"lineNumber":141,"author":{"gitId":"chewbum"},"content":"- The index refers to the index number shown in the displayed client list.","lastModifiedDate":"2024-02-29"},{"lineNumber":142,"author":{"gitId":"chewbum"},"content":"- The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":143,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":144,"author":{"gitId":"chewbum"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":145,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":146,"author":{"gitId":"chewbum"},"content":"- `list` followed by `delete 2` deletes the 2nd client in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":147,"author":{"gitId":"chewbum"},"content":"- `find Betsy` followed by `delete 1` deletes the 1st client in the results of the `find` command.","lastModifiedDate":"2024-02-29"},{"lineNumber":148,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":149,"author":{"gitId":"chewbum"},"content":"## Meeting Functions","lastModifiedDate":"2024-02-29"},{"lineNumber":150,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":151,"author":{"gitId":"chewbum"},"content":"### Adding a Meeting: `add`","lastModifiedDate":"2024-02-29"},{"lineNumber":152,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":153,"author":{"gitId":"chewbum"},"content":"Adds a meeting for a specific client in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":154,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":155,"author":{"gitId":"chewbum"},"content":"Format: `add CLIENT_INDEX n/NAME dt/DATE_TIME v/VENUE [d/DESCRIPTION]…​`","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"chewbum"},"content":"- `CLIENT_INDEX` refers to the index number shown in the displayed client list. The index **must be a positive integer** 1, 2, 3, …​.","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"chewbum"},"content":"- `DATE_TIME` format should be `YYYY-MM-DD HH:MM`, e.g., `2023-01-01 14:00`.","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"chewbum"},"content":"- A meeting can have an optional description(s).","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"chewbum"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"chewbum"},"content":"A meeting can have any number of descriptions (including 0).","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"chewbum"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":165,"author":{"gitId":"chewbum"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":166,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":167,"author":{"gitId":"chewbum"},"content":"- `add 1 n/Project Kickoff dt/2023-03-15 09:00 v/Conference Room d/Initial meeting to discuss project scope`","lastModifiedDate":"2024-02-29"},{"lineNumber":168,"author":{"gitId":"chewbum"},"content":"- `add 2 n/Quarterly Review dt/2023-04-22 11:00 v/Office d/Review last quarter\u0027s performance d/Set next quarter\u0027s objectives`","lastModifiedDate":"2024-02-29"},{"lineNumber":169,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":170,"author":{"gitId":"chewbum"},"content":"### Listing all Meetings for a Client: `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":172,"author":{"gitId":"chewbum"},"content":"Shows a list of all meetings for a specific client.","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"chewbum"},"content":"Format: `list CLIENT_INDEX`","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"chewbum"},"content":"- `CLIENT_INDEX` refers to the index number shown in the displayed client list.","lastModifiedDate":"2024-02-29"},{"lineNumber":177,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":178,"author":{"gitId":"chewbum"},"content":"Example:","lastModifiedDate":"2024-02-29"},{"lineNumber":179,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":180,"author":{"gitId":"chewbum"},"content":"- `list 1` Lists all meetings for the first client.","lastModifiedDate":"2024-02-29"},{"lineNumber":181,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":182,"author":{"gitId":"chewbum"},"content":"### Editing a Meeting: `edit`","lastModifiedDate":"2024-02-29"},{"lineNumber":183,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":184,"author":{"gitId":"chewbum"},"content":"Edits an existing meeting for a client.","lastModifiedDate":"2024-02-29"},{"lineNumber":185,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":186,"author":{"gitId":"chewbum"},"content":"Format: `edit CLIENT_INDEX MEETING_INDEX [n/NAME] [dt/DATE_TIME] [v/VENUE] [d/DESCRIPTION]…​`","lastModifiedDate":"2024-02-29"},{"lineNumber":187,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":188,"author":{"gitId":"chewbum"},"content":"- Edits the meeting specified by `MEETING_INDEX` for the client specified by `CLIENT_INDEX`. Both indexes must be positive integers 1, 2, 3, …​.","lastModifiedDate":"2024-02-29"},{"lineNumber":189,"author":{"gitId":"chewbum"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-02-29"},{"lineNumber":190,"author":{"gitId":"chewbum"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-02-29"},{"lineNumber":191,"author":{"gitId":"chewbum"},"content":"- When editing descriptions, the existing descriptions of the meeting will be removed i.e adding of descriptions is not cumulative.","lastModifiedDate":"2024-02-29"},{"lineNumber":192,"author":{"gitId":"chewbum"},"content":"- You can remove all the meeting’s descriptions by typing `d/` without specifying any descriptions after it.","lastModifiedDate":"2024-02-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":196,"author":{"gitId":"chewbum"},"content":"- `edit 1 2 n/Annual Review dt/2023-12-01 10:00 v/Main Office` Edits the name, date/time, and venue of the 2nd meeting for the 1st client.","lastModifiedDate":"2024-02-29"},{"lineNumber":197,"author":{"gitId":"chewbum"},"content":"- `edit 2 1 n/Budget Meeting d/` Edits the name of the 1st meeting for the 2nd client and clears all existing descriptions.","lastModifiedDate":"2024-02-29"},{"lineNumber":198,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":199,"author":{"gitId":"chewbum"},"content":"### Deleting a Meeting: `delete`","lastModifiedDate":"2024-02-29"},{"lineNumber":200,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":201,"author":{"gitId":"chewbum"},"content":"Deletes a specific meeting for a client.","lastModifiedDate":"2024-02-29"},{"lineNumber":202,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":203,"author":{"gitId":"chewbum"},"content":"Format: `delete CLIENT_INDEX MEETING_INDEX`","lastModifiedDate":"2024-02-29"},{"lineNumber":204,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":205,"author":{"gitId":"chewbum"},"content":"- Deletes the meeting specified by `MEETING_INDEX` for the client specified by `CLIENT_INDEX`. Both indexes must be positive integers 1, 2, 3, …​.","lastModifiedDate":"2024-02-29"},{"lineNumber":206,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":207,"author":{"gitId":"chewbum"},"content":"Example:","lastModifiedDate":"2024-02-29"},{"lineNumber":208,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":209,"author":{"gitId":"chewbum"},"content":"- `delete 3 1` Deletes the first meeting for the third client.","lastModifiedDate":"2024-02-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"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":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":229,"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":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":232,"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":233,"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":234,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":236,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"timothysashimi"},"content":"**Q**: How do I use the app?\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":245,"author":{"gitId":"timothysashimi"},"content":"**A**: This app is designed to help you keep track of your clients and meetings with them. \u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":246,"author":{"gitId":"timothysashimi"},"content":" To keep track of your clients/meetings, you can follow the various commands in the user guide and enter the commands according to the specified format.","lastModifiedDate":"2024-03-02"},{"lineNumber":247,"author":{"gitId":"timothysashimi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":248,"author":{"gitId":"timothysashimi"},"content":"**Q**: Is there a limit to the number of clients/meetings I can store in the app\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":249,"author":{"gitId":"timothysashimi"},"content":"**A**: No, there is no limit to the number.","lastModifiedDate":"2024-03-02"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":255,"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":256,"author":{"gitId":"timothysashimi"},"content":"2. **When entering a command with an invalid format**, the application will prompt you to re-enter the command while providing the correct format to follow.","lastModifiedDate":"2024-03-02"},{"lineNumber":257,"author":{"gitId":"timothysashimi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":259,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2024-02-27"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":263,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Client Functions","lastModifiedDate":"2024-02-27"},{"lineNumber":264,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":265,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-27"},{"lineNumber":266,"author":{"gitId":"chewbum"},"content":"| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"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":"2024-02-27"},{"lineNumber":268,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **List** | `list`\u003cbr\u003e e.g., `list` |","lastModifiedDate":"2024-02-27"},{"lineNumber":269,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Edit** | `edit CLIENT_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":"2024-02-27"},{"lineNumber":270,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Delete** | `delete CLIENT_INDEX`\u003cbr\u003e e.g., `delete 3` \u003cbr/\u003e |","lastModifiedDate":"2024-02-27"},{"lineNumber":271,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake` |","lastModifiedDate":"2024-02-27"},{"lineNumber":272,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":273,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Meeting Functions","lastModifiedDate":"2024-02-27"},{"lineNumber":274,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":275,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-27"},{"lineNumber":276,"author":{"gitId":"chewbum"},"content":"| ---------- | --------------------------------------------------------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Add** | `add CLIENT_INDEX n/NAME`\u003cbr\u003ee.g., `add 1 n/James Ho` |","lastModifiedDate":"2024-02-27"},{"lineNumber":278,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **List** | `list CLIENT_INDEX`\u003cbr\u003ee.g., `list 2` |","lastModifiedDate":"2024-02-27"},{"lineNumber":279,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Edit** | `edit CLIENT_INDEX MEETING_INDEX`\u003cbr\u003ee.g.,`edit 1 2 n/Jamal Ho` |","lastModifiedDate":"2024-02-27"},{"lineNumber":280,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Delete** | `delete CLIENT_INDEX MEETING_INDEX`\u003cbr\u003ee.g., `delete 3 1` |","lastModifiedDate":"2024-02-27"},{"lineNumber":281,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":282,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### General Functions","lastModifiedDate":"2024-02-27"},{"lineNumber":283,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":284,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-27"},{"lineNumber":285,"author":{"gitId":"chewbum"},"content":"| --------- | ---------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-02-27"},{"lineNumber":287,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"timothysashimi":8,"chewbum":118,"-":139,"itstrueitstrueitsrealitsreal":22}},{"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":"sethteo"},"content":" content: \"FinCliQ\";","lastModifiedDate":"2024-02-26"},{"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":{"sethteo":1,"-":294}},{"path":"docs/team/kenneth.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"layout: page","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"title: Kenneth Seet\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Project: FinCliq","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"FinCliq is a desktop client and meeting tracker application optimised for CLI users.","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"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-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **New Feature**: Added the ability to delete meetings. ([\\#10](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/10))","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * What it does: allows the user to delete meetings that a client has.","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Justification: This feature is essential to allow financial advisors to manage their client\u0027s meetings.","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Credits: This feature was implemented with reference to AddressBook\u0027s delete feature, but","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" it was a non-trivial task to adapt it to our application\u0027s context.","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # (* **Code contributed**: [RepoSense link]\u0026#40;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **Project management**:","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Managed release [`v1.1`](https://github.com/AY2324S2-CS2103-F08-1/tp/milestone/1) on GitHub","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # (* **Enhancements to existing features**:)","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Updated the GUI color scheme \u0026#40;Pull requests [\\#33]\u0026#40;\u0026#41;, [\\#34]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Wrote additional tests for existing features to increase coverage from 88% to 92% \u0026#40;Pull requests [\\#36]\u0026#40;\u0026#41;, [\\#38]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * User Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Added documentation for command summary: [\\#37](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/37)","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Added the Non-Functional Requirements section: [\\#41](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/41)","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Added the target user profile, value proposition, and user stories: [\\#39](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/39)","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # (* **Community**:)","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * PRs reviewed \u0026#40;with non-trivial review comments\u0026#41;: [\\#12]\u0026#40;\u0026#41;, [\\#32]\u0026#40;\u0026#41;, [\\#19]\u0026#40;\u0026#41;, [\\#42]\u0026#40;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Contributed to forum discussions \u0026#40;examples: [1]\u0026#40;\u0026#41;, [2]\u0026#40;\u0026#41;, [3]\u0026#40;\u0026#41;, [4]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":48,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":49,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Reported bugs and suggestions for other teams in the class \u0026#40;examples: [1]\u0026#40;\u0026#41;, [2]\u0026#40;\u0026#41;, [3]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Some parts of the history feature I added was adopted by several other class mates \u0026#40;[1]\u0026#40;\u0026#41;, [2]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **Tools**:","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Integrated CodeCov to the team repo","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":54}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F08-1/tp/actions)","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F08-1/tp/graph/badge.svg?token\u003d15QKN9GAV0)](https://codecov.io/gh/AY2324S2-CS2103-F08-1/tp)","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"sethteo"},"content":"## FinCliQ, the one-stop client management application for Financial Advisors.","lastModifiedDate":"2024-02-26"},{"lineNumber":5,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"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":"sethteo"},"content":"### About the App","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* The app allows Financial Advisors to keep track of the clients under them as well as the scheduled meeting with their clients.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"sethteo"},"content":" * It is **written in OOP fashion** and provides a **reasonably well-written** code base.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"sethteo"},"content":"* Example usages:","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"sethteo"},"content":" * Allows Financial Advisors to add new clients, delete existing clients","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"sethteo"},"content":" * Allows Financial Advisors to create meetings with existing clients","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"sethteo"},"content":" * Allows Financial Advisors to delete meetings with existing clients","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"sethteo"},"content":"* We hope that through FinCliQ we can help Financial Advisors achieve financial freedom for all their customers by","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"sethteo"},"content":"* providing an easy way to keep track of all clients and the meetings with them.","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"sethteo"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"sethteo"},"content":"### Acknowledgements","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"sethteo"},"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":{"sethteo":15,"itstrueitstrueitsrealitsreal":2,"-":5}},{"path":"bin/main/view/CommandBox.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.TextField?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cStackPane styleClass\u003d\"stack-pane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cTextField fx:id\u003d\"commandTextField\" onAction\u003d\"#handleCommandEntered\" promptText\u003d\"Enter command here...\"/\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":9}},{"path":"bin/main/view/DarkTheme.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".background {","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" background-color: #383838; /* Used in the default.html file */","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".label {","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #555555;","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".label-bright {","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".label-header {","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 32pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".text-field {","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 12pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tab-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tab-pane .tab-header-area {","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-min-height: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-max-height: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view {","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-base: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-control-inner-background: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-table-cell-border-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-table-header-border-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":48,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 5;","lastModifiedDate":"2024-02-27"},{"lineNumber":49,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view .column-header-background {","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view .column-header, .table-view .filler {","lastModifiedDate":"2024-02-27"},{"lineNumber":56,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-size: 35;","lastModifiedDate":"2024-02-27"},{"lineNumber":57,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 0 0 1 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":58,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":59,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color:","lastModifiedDate":"2024-02-27"},{"lineNumber":60,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" transparent","lastModifiedDate":"2024-02-27"},{"lineNumber":61,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" transparent","lastModifiedDate":"2024-02-27"},{"lineNumber":62,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" derive(-fx-base, 80%)","lastModifiedDate":"2024-02-27"},{"lineNumber":63,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":64,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-insets: 0 10 1 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":65,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":66,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":67,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view .column-header .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":68,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 20pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":69,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":70,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":71,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-alignment: center-left;","lastModifiedDate":"2024-02-27"},{"lineNumber":72,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":73,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":74,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":75,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".table-view:focused .table-row-cell:filled:focused:selected {","lastModifiedDate":"2024-02-27"},{"lineNumber":76,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-02-27"},{"lineNumber":77,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":78,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":79,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".split-pane:horizontal .split-pane-divider {","lastModifiedDate":"2024-02-27"},{"lineNumber":80,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":81,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: transparent transparent transparent #4d4d4d;","lastModifiedDate":"2024-02-27"},{"lineNumber":82,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":83,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":84,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".split-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":85,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":86,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":87,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":88,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":89,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":90,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-view {","lastModifiedDate":"2024-02-27"},{"lineNumber":91,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":92,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":93,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":94,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":95,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":96,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell {","lastModifiedDate":"2024-02-27"},{"lineNumber":97,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-label-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":98,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-graphic-text-gap : 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":99,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":100,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":101,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":102,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:even {","lastModifiedDate":"2024-02-27"},{"lineNumber":103,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #3c3e3f;","lastModifiedDate":"2024-02-27"},{"lineNumber":104,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":105,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":106,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:odd {","lastModifiedDate":"2024-02-27"},{"lineNumber":107,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #515658;","lastModifiedDate":"2024-02-27"},{"lineNumber":108,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":109,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":110,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:selected {","lastModifiedDate":"2024-02-27"},{"lineNumber":111,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #424d5f;","lastModifiedDate":"2024-02-27"},{"lineNumber":112,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":113,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":114,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:filled:selected #cardPane {","lastModifiedDate":"2024-02-27"},{"lineNumber":115,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: #3e7b91;","lastModifiedDate":"2024-02-27"},{"lineNumber":116,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":117,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":118,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":119,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":120,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":121,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":122,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":123,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".cell_big_label {","lastModifiedDate":"2024-02-27"},{"lineNumber":124,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-02-27"},{"lineNumber":125,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 16px;","lastModifiedDate":"2024-02-27"},{"lineNumber":126,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-02-27"},{"lineNumber":127,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":128,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":129,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".cell_small_label {","lastModifiedDate":"2024-02-27"},{"lineNumber":130,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI\";","lastModifiedDate":"2024-02-27"},{"lineNumber":131,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 13px;","lastModifiedDate":"2024-02-27"},{"lineNumber":132,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-02-27"},{"lineNumber":133,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":134,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":135,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".stack-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":136,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":137,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":138,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":139,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".pane-with-border {","lastModifiedDate":"2024-02-27"},{"lineNumber":140,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":141,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: derive(#1d1d1d, 10%);","lastModifiedDate":"2024-02-27"},{"lineNumber":142,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-top-width: 1px;","lastModifiedDate":"2024-02-27"},{"lineNumber":143,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":144,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":145,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar {","lastModifiedDate":"2024-02-27"},{"lineNumber":146,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":147,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":148,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":149,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".result-display {","lastModifiedDate":"2024-02-27"},{"lineNumber":150,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":151,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":152,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":153,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":154,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":155,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":156,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".result-display .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":157,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: black !important;","lastModifiedDate":"2024-02-27"},{"lineNumber":158,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":159,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":160,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":161,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":162,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":163,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 4px;","lastModifiedDate":"2024-02-27"},{"lineNumber":164,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-pref-height: 30px;","lastModifiedDate":"2024-02-27"},{"lineNumber":165,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":166,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":167,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar-with-border {","lastModifiedDate":"2024-02-27"},{"lineNumber":168,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":169,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-02-27"},{"lineNumber":170,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-02-27"},{"lineNumber":171,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":172,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":173,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".status-bar-with-border .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":174,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":175,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":176,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":177,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".grid-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":178,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":179,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":180,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-02-27"},{"lineNumber":181,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":182,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":183,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".grid-pane .stack-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":184,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":185,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":186,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":187,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".context-menu {","lastModifiedDate":"2024-02-27"},{"lineNumber":188,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-02-27"},{"lineNumber":189,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":190,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":191,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".context-menu .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":192,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":193,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":194,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":195,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".menu-bar {","lastModifiedDate":"2024-02-27"},{"lineNumber":196,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":197,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":198,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":199,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".menu-bar .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":200,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 14pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":201,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":202,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":203,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-02-27"},{"lineNumber":204,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":205,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":206,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".menu .left-container {","lastModifiedDate":"2024-02-27"},{"lineNumber":207,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: black;","lastModifiedDate":"2024-02-27"},{"lineNumber":208,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":209,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":210,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"/*","lastModifiedDate":"2024-02-27"},{"lineNumber":211,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Metro style Push Button","lastModifiedDate":"2024-02-27"},{"lineNumber":212,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Author: Pedro Duque Vieira","lastModifiedDate":"2024-02-27"},{"lineNumber":213,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * http://pixelduke.wordpress.com/2012/10/23/jmetro-windows-8-controls-on-java/","lastModifiedDate":"2024-02-27"},{"lineNumber":214,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" */","lastModifiedDate":"2024-02-27"},{"lineNumber":215,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button {","lastModifiedDate":"2024-02-27"},{"lineNumber":216,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 5 22 5 22;","lastModifiedDate":"2024-02-27"},{"lineNumber":217,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: #e2e2e2;","lastModifiedDate":"2024-02-27"},{"lineNumber":218,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":219,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":220,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":221,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI\", Helvetica, Arial, sans-serif;","lastModifiedDate":"2024-02-27"},{"lineNumber":222,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":223,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #d8d8d8;","lastModifiedDate":"2024-02-27"},{"lineNumber":224,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 0 0 0 0, 0, 1, 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":225,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":226,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":227,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:hover {","lastModifiedDate":"2024-02-27"},{"lineNumber":228,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #3a3a3a;","lastModifiedDate":"2024-02-27"},{"lineNumber":229,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":230,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":231,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:pressed, .button:default:hover:pressed {","lastModifiedDate":"2024-02-27"},{"lineNumber":232,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":233,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":234,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":235,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":236,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:focused {","lastModifiedDate":"2024-02-27"},{"lineNumber":237,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: white, white;","lastModifiedDate":"2024-02-27"},{"lineNumber":238,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1, 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":239,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-style: solid, segments(1, 1);","lastModifiedDate":"2024-02-27"},{"lineNumber":240,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 0, 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":241,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-insets: 1 1 1 1, 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":242,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":243,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":244,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:disabled, .button:default:disabled {","lastModifiedDate":"2024-02-27"},{"lineNumber":245,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-opacity: 0.4;","lastModifiedDate":"2024-02-27"},{"lineNumber":246,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":247,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":248,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":249,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":250,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:default {","lastModifiedDate":"2024-02-27"},{"lineNumber":251,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-02-27"},{"lineNumber":252,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #ffffff;","lastModifiedDate":"2024-02-27"},{"lineNumber":253,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":254,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":255,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".button:default:hover {","lastModifiedDate":"2024-02-27"},{"lineNumber":256,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(-fx-focus-color, 30%);","lastModifiedDate":"2024-02-27"},{"lineNumber":257,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":258,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":259,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane {","lastModifiedDate":"2024-02-27"},{"lineNumber":260,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":261,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":262,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":263,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane \u003e *.button-bar \u003e *.container {","lastModifiedDate":"2024-02-27"},{"lineNumber":264,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-02-27"},{"lineNumber":265,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":266,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":267,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane \u003e *.label.content {","lastModifiedDate":"2024-02-27"},{"lineNumber":268,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 14px;","lastModifiedDate":"2024-02-27"},{"lineNumber":269,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-weight: bold;","lastModifiedDate":"2024-02-27"},{"lineNumber":270,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":271,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":272,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":273,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane:header *.header-panel {","lastModifiedDate":"2024-02-27"},{"lineNumber":274,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-02-27"},{"lineNumber":275,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":276,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":277,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".dialog-pane:header *.header-panel *.label {","lastModifiedDate":"2024-02-27"},{"lineNumber":278,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 18px;","lastModifiedDate":"2024-02-27"},{"lineNumber":279,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-style: italic;","lastModifiedDate":"2024-02-27"},{"lineNumber":280,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":281,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":282,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":283,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":284,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar {","lastModifiedDate":"2024-02-27"},{"lineNumber":285,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":286,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":287,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":288,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar .thumb {","lastModifiedDate":"2024-02-27"},{"lineNumber":289,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-02-27"},{"lineNumber":290,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":291,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":292,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":293,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar .increment-button, .scroll-bar .decrement-button {","lastModifiedDate":"2024-02-27"},{"lineNumber":294,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":295,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":296,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":297,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar .increment-arrow, .scroll-bar .decrement-arrow {","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-shape: \" \";","lastModifiedDate":"2024-02-27"},{"lineNumber":300,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":301,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":302,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar:vertical .increment-arrow, .scroll-bar:vertical .decrement-arrow {","lastModifiedDate":"2024-02-27"},{"lineNumber":303,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 1 8 1 8;","lastModifiedDate":"2024-02-27"},{"lineNumber":304,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":305,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":306,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".scroll-bar:horizontal .increment-arrow, .scroll-bar:horizontal .decrement-arrow {","lastModifiedDate":"2024-02-27"},{"lineNumber":307,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 8 1 8 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":308,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":309,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":310,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#cardPane {","lastModifiedDate":"2024-02-27"},{"lineNumber":311,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-02-27"},{"lineNumber":312,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":313,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":314,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":315,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#commandTypeLabel {","lastModifiedDate":"2024-02-27"},{"lineNumber":316,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11px;","lastModifiedDate":"2024-02-27"},{"lineNumber":317,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #F70D1A;","lastModifiedDate":"2024-02-27"},{"lineNumber":318,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":319,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":320,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#commandTextField {","lastModifiedDate":"2024-02-27"},{"lineNumber":321,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent #383838 transparent #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":322,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":323,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: #383838 #383838 #ffffff #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":324,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-insets: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":325,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":326,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-02-27"},{"lineNumber":327,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-02-27"},{"lineNumber":328,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":329,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":330,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":331,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#filterField, #personListPanel, #personWebpage {","lastModifiedDate":"2024-02-27"},{"lineNumber":332,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-effect: innershadow(gaussian, black, 10, 0, 0, 0);","lastModifiedDate":"2024-02-27"},{"lineNumber":333,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":334,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":335,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#resultDisplay .content {","lastModifiedDate":"2024-02-27"},{"lineNumber":336,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: transparent, #383838, transparent, #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":337,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-02-27"},{"lineNumber":338,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":339,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":340,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#tags {","lastModifiedDate":"2024-02-27"},{"lineNumber":341,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-hgap: 7;","lastModifiedDate":"2024-02-27"},{"lineNumber":342,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-vgap: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":343,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":344,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":345,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#tags .label {","lastModifiedDate":"2024-02-27"},{"lineNumber":346,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":347,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: #3e7b91;","lastModifiedDate":"2024-02-27"},{"lineNumber":348,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-padding: 1 3 1 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":349,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":350,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 2;","lastModifiedDate":"2024-02-27"},{"lineNumber":351,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-font-size: 11;","lastModifiedDate":"2024-02-27"},{"lineNumber":352,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":352}},{"path":"bin/main/view/Extensions.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".error {","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: #d06651 !important; /* The error class should always override the default text-fill style */","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".list-cell:empty {","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" /* Empty cells will not have alternating colours */","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background: #383838;","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tag-selector {","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-color: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-border-radius: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-radius: 3;","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":".tooltip-text {","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":20}},{"path":"bin/main/view/HelpWindow.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton, #helpMessage {","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton {","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: dimgray;","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton:hover {","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: gray;","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#copyButton:armed {","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: darkgray;","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"#helpMessageContainer {","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":19}},{"path":"bin/main/view/HelpWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Button?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.stage.Stage?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cfx:root resizable\u003d\"false\" title\u003d\"Help\" type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cImage url\u003d\"@/images/help_icon.png\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cURL value\u003d\"@HelpWindow.css\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox alignment\u003d\"CENTER\" fx:id\u003d\"helpMessageContainer\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cchildren\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"helpMessage\" text\u003d\"Label\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets right\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cButton fx:id\u003d\"copyButton\" mnemonicParsing\u003d\"false\" onAction\u003d\"#copyUrl\" text\u003d\"Copy URL\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets left\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Button\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/children\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003copaqueInsets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/opaqueInsets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":44}},{"path":"bin/main/view/MainWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Menu?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.MenuBar?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.MenuItem?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.SplitPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cfx:root type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" title\u003d\"Address App\" minWidth\u003d\"450\" minHeight\u003d\"600\" onCloseRequest\u003d\"#handleExit\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cImage url\u003d\"@/images/address_book_32.png\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cURL value\u003d\"@DarkTheme.css\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cURL value\u003d\"@Extensions.css\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cVBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenuBar fx:id\u003d\"menuBar\" VBox.vgrow\u003d\"NEVER\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"File\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenuItem mnemonicParsing\u003d\"false\" onAction\u003d\"#handleExit\" text\u003d\"Exit\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"Help\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cMenuItem fx:id\u003d\"helpMenuItem\" mnemonicParsing\u003d\"false\" onAction\u003d\"#handleHelp\" text\u003d\"Help\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/MenuBar\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"commandBoxPlaceholder\" styleClass\u003d\"pane-with-border\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"resultDisplayPlaceholder\" styleClass\u003d\"pane-with-border\"","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" minHeight\u003d\"100\" prefHeight\u003d\"100\" maxHeight\u003d\"100\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":48,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":49,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cVBox fx:id\u003d\"personList\" styleClass\u003d\"pane-with-border\" minWidth\u003d\"340\" prefWidth\u003d\"340\" VBox.vgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"10\" right\u003d\"10\" bottom\u003d\"10\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane fx:id\u003d\"personListPanelPlaceholder\" VBox.vgrow\u003d\"ALWAYS\"/\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":56,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cStackPane fx:id\u003d\"statusbarPlaceholder\" VBox.vgrow\u003d\"NEVER\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":57,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":58,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":59,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":60,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":60}},{"path":"bin/main/view/PersonListCard.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"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":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cFlowPane fx:id\u003d\"tags\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":36}},{"path":"bin/main/view/PersonListPanel.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.ListView?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cVBox xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cListView fx:id\u003d\"personListView\" VBox.vgrow\u003d\"ALWAYS\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/VBox\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":8}},{"path":"bin/main/view/ResultDisplay.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.TextArea?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cStackPane fx:id\u003d\"placeHolder\" styleClass\u003d\"pane-with-border\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cTextArea fx:id\u003d\"resultDisplay\" editable\u003d\"false\" styleClass\u003d\"result-display\"/\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":9}},{"path":"bin/main/view/StatusBarFooter.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cGridPane styleClass\u003d\"status-bar\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003cLabel fx:id\u003d\"saveLocationStatus\" /\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/GridPane\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":12}},{"path":"bin/test/view/UiPartTest/invalidFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"Not a valid FXML file","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":1}},{"path":"bin/test/view/UiPartTest/validFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?import seedu.address.ui.TestFxmlObject?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cTestFxmlObject xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:id\u003d\"validFileRoot\"\u003eHello World!\u003c/TestFxmlObject\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":4}},{"path":"bin/test/view/UiPartTest/validFileWithFxRoot.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cfx:root type\u003d\"seedu.address.ui.TestFxmlObject\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" \u003ctext\u003eHello World!\u003c/text\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":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":"jaejayrome"},"content":"### Jerome Goh","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"sethteo"},"content":"\u003cimg src\u003d\"images/jaejayrome.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"jaejayrome"},"content":"[[github](https://github.com/jaejayrome)]","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"jaejayrome"},"content":"- Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"jaejayrome"},"content":"- Responsibilities: Model","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"timothysashimi"},"content":"### Timothy Chan","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"sethteo"},"content":"\u003cimg src\u003d\"images/timothysashimi.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"timothysashimi"},"content":"[[github](http://github.com/timothysashimi)]","lastModifiedDate":"2024-03-01"},{"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":"timothysashimi"},"content":"- Role: Developer","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"chewbum"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Kenneth Seet","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"\u003cimg src\u003d\"images/itstrueitstrueitsrealitsreal.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[[github](http://github.com/itstrueitstrueitsrealitsreal)] [[portfolio](team/kenneth.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"chewbum"},"content":"- Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"chewbum"},"content":"- Responsibilities: Project Management","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"sethteo"},"content":"### Teo Hong Rui","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"sethteo"},"content":"\u003cimg src\u003d\"images/sethteo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"sethteo"},"content":"[[github](https://github.com/sethteo)]","lastModifiedDate":"2024-02-27"},{"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":"chewbum"},"content":"- Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"chewbum"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Chew Zi Xuan","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chewbum"},"content":"\u003cimg src\u003d\"images/chewbum.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"chewbum"},"content":"[[github](http://github.com/chewbum)]","lastModifiedDate":"2024-02-28"},{"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":"chewbum"},"content":"- Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"chewbum"},"content":"- Responsibilities: Model","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"timothysashimi":3,"sethteo":5,"chewbum":9,"-":34,"itstrueitstrueitsrealitsreal":4,"jaejayrome":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":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"chewbum"},"content":"- Table of Contents","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"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":"chewbum"},"content":"- {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"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":28,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"chewbum"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"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":42,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"chewbum"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"chewbum"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"chewbum"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"chewbum"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"chewbum"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"chewbum"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"chewbum"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"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":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"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":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"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":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"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":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"chewbum"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-04"},{"lineNumber":85,"author":{"gitId":"chewbum"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-04"},{"lineNumber":86,"author":{"gitId":"chewbum"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-04"},{"lineNumber":87,"author":{"gitId":"chewbum"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-04"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"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":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"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":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"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":102,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"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":107,"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":108,"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":109,"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":110,"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":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":112,"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":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":118,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":119,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":122,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":123,"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":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"chewbum"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-04"},{"lineNumber":130,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":131,"author":{"gitId":"chewbum"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-04"},{"lineNumber":132,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":134,"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":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"\u003c/div\u003e","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":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"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":"chewbum"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":148,"author":{"gitId":"chewbum"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-04"},{"lineNumber":149,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":150,"author":{"gitId":"chewbum"},"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-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"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":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"chewbum"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-04"},{"lineNumber":169,"author":{"gitId":"chewbum"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"chewbum"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-04"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"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":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"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":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"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":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"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":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"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":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"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":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"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":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"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":197,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"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":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":211,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":213,"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":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"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":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"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":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"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":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"chewbum"},"content":"- **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2024-03-04"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"chewbum"},"content":" - Pros: Easy to implement.","lastModifiedDate":"2024-03-04"},{"lineNumber":238,"author":{"gitId":"chewbum"},"content":" - Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2024-03-04"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":240,"author":{"gitId":"chewbum"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-04"},{"lineNumber":241,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"chewbum"},"content":" - Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2024-03-04"},{"lineNumber":243,"author":{"gitId":"chewbum"},"content":" - Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2024-03-04"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"chewbum"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":256,"author":{"gitId":"chewbum"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":257,"author":{"gitId":"chewbum"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":258,"author":{"gitId":"chewbum"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":259,"author":{"gitId":"chewbum"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-04"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"chewbum"},"content":"- has a need to manage a significant number of clients","lastModifiedDate":"2024-03-04"},{"lineNumber":270,"author":{"gitId":"chewbum"},"content":"- has a need to manage a significant number of meetings","lastModifiedDate":"2024-03-04"},{"lineNumber":271,"author":{"gitId":"chewbum"},"content":"- has a need to classify clients into different categories","lastModifiedDate":"2024-03-04"},{"lineNumber":272,"author":{"gitId":"chewbum"},"content":"- prefers desktop apps over other types of apps","lastModifiedDate":"2024-03-04"},{"lineNumber":273,"author":{"gitId":"chewbum"},"content":"- can type fast (50 wpm or more)","lastModifiedDate":"2024-03-04"},{"lineNumber":274,"author":{"gitId":"chewbum"},"content":"- prefers typing to mouse interactions","lastModifiedDate":"2024-03-04"},{"lineNumber":275,"author":{"gitId":"chewbum"},"content":"- is reasonably comfortable using CLI apps","lastModifiedDate":"2024-03-04"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"**Value proposition**: A CLI designed specifically for financial advisors to revolutionise the way they manage, schedule, filter and rank their clients. Addresses the day-to-day challenges faced by financial advisors but also provides strategic value through its ranking and leaderboard features. It\u0027s a companion that empowers financial advisors to scale to new heights.","lastModifiedDate":"2024-03-02"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"chewbum"},"content":"| -------- | ---------------------- | ------------------------------------ | ------------------------------------------ |","lastModifiedDate":"2024-03-04"},{"lineNumber":285,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | add new clients profiles to my list | keep track of the clients under me |","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | edit the profiles of my clients | keep their information up to date |","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | delete the clients under me | remove clients that are no longer under me |","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | view all my client profiles | track all my clients in one place |","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | add client meetings | keep track of my schedule |","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"sethteo"},"content":"| `* * *` | As a financial advisor | view upcoming meetings | so I can prepare for them accordingly |","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"sethteo"},"content":"| `* *` | As a financial advisor | search my meetings by date or agenda | locate meetings with specific filters |","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"sethteo"},"content":"| `* *` | As a financial advisor | filter my meetings by date | so I can know the meetings of that day |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"sethteo"},"content":"| `*` | As a financial advisor | sort persons by name | locate a person easily |","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"chewbum"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-04"},{"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":"jaejayrome"},"content":"(For all use cases below, the **System** is the `FinCliQ` and the **Actor** is the `targeted financial advisor`, unless specified otherwise)","lastModifiedDate":"2024-03-03"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Add New Client Profiles**","lastModifiedDate":"2024-03-03"},{"lineNumber":304,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":305,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to add a new client profile to their list.","lastModifiedDate":"2024-03-03"},{"lineNumber":306,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog adds the new client profile to the advisor\u0027s list.","lastModifiedDate":"2024-03-03"},{"lineNumber":307,"author":{"gitId":"jaejayrome"},"content":"3. ClientCatalog confirms the successful addition of the client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":308,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":309,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":310,"author":{"gitId":"jaejayrome"},"content":"**Extensions:**","lastModifiedDate":"2024-03-03"},{"lineNumber":311,"author":{"gitId":"jaejayrome"},"content":"- 1a. The financial advisor does not provide necessary client information.","lastModifiedDate":"2024-03-03"},{"lineNumber":312,"author":{"gitId":"jaejayrome"},"content":" - 1a1. ClientCatalog detects missing information.","lastModifiedDate":"2024-03-03"},{"lineNumber":313,"author":{"gitId":"jaejayrome"},"content":" - 1a2. ClientCatalog prompts the financial advisor to provide the missing information.","lastModifiedDate":"2024-03-03"},{"lineNumber":314,"author":{"gitId":"jaejayrome"},"content":" - Use case resumes from step 1.","lastModifiedDate":"2024-03-03"},{"lineNumber":315,"author":{"gitId":"jaejayrome"},"content":"- 1b. The financial advisor attempts to add a client profile that already exists.","lastModifiedDate":"2024-03-03"},{"lineNumber":316,"author":{"gitId":"jaejayrome"},"content":" - 1b1. ClientCatalog detects duplicate profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":317,"author":{"gitId":"jaejayrome"},"content":" - 1b2. ClientCatalog notifies the financial advisor about the existing profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":318,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":319,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":320,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Edit Client Profiles**","lastModifiedDate":"2024-03-03"},{"lineNumber":321,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":322,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to edit the profile of a client.","lastModifiedDate":"2024-03-03"},{"lineNumber":323,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog retrieves the client\u0027s profile for editing.","lastModifiedDate":"2024-03-03"},{"lineNumber":324,"author":{"gitId":"jaejayrome"},"content":"3. Financial advisor updates the necessary information.","lastModifiedDate":"2024-03-03"},{"lineNumber":325,"author":{"gitId":"jaejayrome"},"content":"4. ClientCatalog saves the changes to the client\u0027s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":326,"author":{"gitId":"jaejayrome"},"content":"5. ClientCatalog confirms the successful update of the client\u0027s profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":327,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":328,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":329,"author":{"gitId":"jaejayrome"},"content":"**Extensions:**","lastModifiedDate":"2024-03-03"},{"lineNumber":330,"author":{"gitId":"jaejayrome"},"content":"- 1a. The financial advisor tries to edit a non-existent client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":331,"author":{"gitId":"jaejayrome"},"content":" - 1a1. ClientCatalog detects the absence of the client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":332,"author":{"gitId":"jaejayrome"},"content":" - 1a2. ClientCatalog notifies the financial advisor about the non-existence of the client profile.","lastModifiedDate":"2024-03-03"},{"lineNumber":333,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":334,"author":{"gitId":"jaejayrome"},"content":"- 1b. The financial advisor attempts to edit the profile with invalid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":335,"author":{"gitId":"jaejayrome"},"content":" - 1b1. ClientCatalog detects invalid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":336,"author":{"gitId":"jaejayrome"},"content":" - 1b2. ClientCatalog prompts the financial advisor to provide valid information.","lastModifiedDate":"2024-03-03"},{"lineNumber":337,"author":{"gitId":"jaejayrome"},"content":" - Use case resumes from step 3.","lastModifiedDate":"2024-03-03"},{"lineNumber":338,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":339,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Delete Clients**","lastModifiedDate":"2024-03-03"},{"lineNumber":340,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":341,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to delete a client from their list.","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog removes the specified client from the advisor\u0027s list.","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"jaejayrome"},"content":"3. ClientCatalog confirms the successful deletion of the client.","lastModifiedDate":"2024-03-03"},{"lineNumber":344,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":345,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":346,"author":{"gitId":"jaejayrome"},"content":"**Extensions:**","lastModifiedDate":"2024-03-03"},{"lineNumber":347,"author":{"gitId":"jaejayrome"},"content":"- 1a. The financial advisor tries to delete a non-existent client.","lastModifiedDate":"2024-03-03"},{"lineNumber":348,"author":{"gitId":"jaejayrome"},"content":" - 1a1. ClientCatalog detects the absence of the client.","lastModifiedDate":"2024-03-03"},{"lineNumber":349,"author":{"gitId":"jaejayrome"},"content":" - 1a2. ClientCatalog notifies the financial advisor about the non-existence of the client.","lastModifiedDate":"2024-03-03"},{"lineNumber":350,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":351,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":352,"author":{"gitId":"jaejayrome"},"content":"**Use Case: View All Client Profiles**","lastModifiedDate":"2024-03-03"},{"lineNumber":353,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":354,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to view all client profiles.","lastModifiedDate":"2024-03-03"},{"lineNumber":355,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog retrieves and displays all client profiles associated with the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Add Client Meetings**","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to add a meeting with a client to their schedule.","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler schedules the meeting with the specified client.","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"jaejayrome"},"content":"3. MeetingScheduler confirms the successful addition of the meeting to the advisor\u0027s schedule.","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"jaejayrome"},"content":"**Use Case: View Upcoming Meetings**","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to view all upcoming meetings.","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler retrieves and displays all upcoming meetings scheduled for the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Search Meetings by Date or Agenda**","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to search for meetings based on date or agenda.","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler filters meetings based on the specified date or agenda.","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"jaejayrome"},"content":"3. MeetingScheduler displays the filtered meetings to the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Filter Meetings by Date**","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to filter meetings by date.","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"jaejayrome"},"content":"2. MeetingScheduler filters meetings based on the specified date.","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"jaejayrome"},"content":"3. MeetingScheduler displays the filtered meetings to the advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"jaejayrome"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":385,"author":{"gitId":"jaejayrome"},"content":"**Use Case: Sort Persons by Name**","lastModifiedDate":"2024-03-03"},{"lineNumber":386,"author":{"gitId":"jaejayrome"},"content":"**MSS:**","lastModifiedDate":"2024-03-03"},{"lineNumber":387,"author":{"gitId":"jaejayrome"},"content":"1. Financial advisor requests to sort persons by name.","lastModifiedDate":"2024-03-03"},{"lineNumber":388,"author":{"gitId":"jaejayrome"},"content":"2. ClientCatalog sorts the list of persons alphabetically by name.","lastModifiedDate":"2024-03-03"},{"lineNumber":389,"author":{"gitId":"jaejayrome"},"content":"3. ClientCatalog displays the sorted list to the financial advisor.","lastModifiedDate":"2024-03-03"},{"lineNumber":390,"author":{"gitId":"jaejayrome"},"content":" - Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"chewbum"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"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":397,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for","lastModifiedDate":"2024-02-27"},{"lineNumber":398,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" typical usage.","lastModifiedDate":"2024-02-27"},{"lineNumber":399,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. Should be able to hold up to 10 meetings per client without a noticeable sluggishness in","lastModifiedDate":"2024-02-27"},{"lineNumber":400,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" performance for typical usage.","lastModifiedDate":"2024-02-27"},{"lineNumber":401,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. A user with above average typing speed for regular English text (i.e. not code, not system","lastModifiedDate":"2024-02-27"},{"lineNumber":402,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-02-27"},{"lineNumber":403,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. A user should be able to use the system without much guidance.","lastModifiedDate":"2024-02-27"},{"lineNumber":404,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. The application should only require a standalone executable file to run. No other software should be required to be installed.","lastModifiedDate":"2024-02-27"},{"lineNumber":405,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"1. The system should respond within 3 seconds to ensure smooth user experience.","lastModifiedDate":"2024-02-27"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"chewbum"},"content":"- **Financial Advisor (FA)**: A user of the FinCliq app who provides financial advice and services to clients.","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"chewbum"},"content":"- **Client**: An individual who seeks financial advice and potentially uses the services of a user of the FinCliq platform.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"chewbum"},"content":"- **Meeting**: A scheduled interaction between a Financial Advisor and a Client. Can be virtual or in-person.","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"chewbum"},"content":"- **Meeting Notes**: Textual records or summaries of discussions and decisions made during a meeting.","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"chewbum"},"content":"- **Use Case**: A description of a specific user goal or task and the steps required to achieve it.","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"chewbum"},"content":"- **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"chewbum"},"content":"- **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-03-04"},{"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":{"sethteo":9,"chewbum":68,"-":292,"itstrueitstrueitsrealitsreal":10,"jaejayrome":89}},{"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":"chewbum"},"content":"- Table of Contents","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":" - `list` : Lists all contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"chewbum"},"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":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"chewbum"},"content":" - `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"chewbum"},"content":" - `clear` : Deletes all contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"chewbum"},"content":" - `exit` : Exits the app.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"## Client Functions","lastModifiedDate":"2024-02-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"chewbum"},"content":"### Adding a client: `add`","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"chewbum"},"content":"Adds a client to the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"chewbum"},"content":"A client can have any number of tags (including 0)","lastModifiedDate":"2024-02-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"chewbum"},"content":"- `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2024-02-29"},{"lineNumber":89,"author":{"gitId":"chewbum"},"content":"- `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2024-02-29"},{"lineNumber":90,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":91,"author":{"gitId":"chewbum"},"content":"### Listing all clients : `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"chewbum"},"content":"Shows a list of all clients in the address book.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"### Editing a client : `edit`","lastModifiedDate":"2024-02-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"chewbum"},"content":"Edits an existing client in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"chewbum"},"content":"- Edits the client at the specified `INDEX`. The index refers to the index number shown in the displayed client list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"chewbum"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"chewbum"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"chewbum"},"content":"- When editing tags, the existing tags of the client will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"chewbum"},"content":"- You can remove all the client’s tags by typing `t/` without","lastModifiedDate":"2024-02-29"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"chewbum"},"content":"- `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st client to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"chewbum"},"content":"- `edit 2 n/Betsy Crower t/` Edits the name of the 2nd client to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"chewbum"},"content":"### Locating clients by name: `find`","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"chewbum"},"content":"- The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2024-02-29"},{"lineNumber":122,"author":{"gitId":"chewbum"},"content":"- The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"chewbum"},"content":"- Only the name is searched.","lastModifiedDate":"2024-02-29"},{"lineNumber":124,"author":{"gitId":"chewbum"},"content":"- Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"chewbum"},"content":"- Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"chewbum"},"content":"- `find John` returns `john` and `John Doe`","lastModifiedDate":"2024-02-29"},{"lineNumber":131,"author":{"gitId":"chewbum"},"content":"- `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"### Deleting a client : `delete`","lastModifiedDate":"2024-02-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"chewbum"},"content":"Deletes the specified client from the address book.","lastModifiedDate":"2024-02-29"},{"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":"chewbum"},"content":"- Deletes the client at the specified `INDEX`.","lastModifiedDate":"2024-02-29"},{"lineNumber":141,"author":{"gitId":"chewbum"},"content":"- The index refers to the index number shown in the displayed client list.","lastModifiedDate":"2024-02-29"},{"lineNumber":142,"author":{"gitId":"chewbum"},"content":"- The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":143,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":144,"author":{"gitId":"chewbum"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":145,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":146,"author":{"gitId":"chewbum"},"content":"- `list` followed by `delete 2` deletes the 2nd client in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":147,"author":{"gitId":"chewbum"},"content":"- `find Betsy` followed by `delete 1` deletes the 1st client in the results of the `find` command.","lastModifiedDate":"2024-02-29"},{"lineNumber":148,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":149,"author":{"gitId":"chewbum"},"content":"## Meeting Functions","lastModifiedDate":"2024-02-29"},{"lineNumber":150,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":151,"author":{"gitId":"chewbum"},"content":"### Adding a Meeting: `add`","lastModifiedDate":"2024-02-29"},{"lineNumber":152,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":153,"author":{"gitId":"chewbum"},"content":"Adds a meeting for a specific client in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":154,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":155,"author":{"gitId":"chewbum"},"content":"Format: `add CLIENT_INDEX n/NAME dt/DATE_TIME v/VENUE [d/DESCRIPTION]…​`","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"chewbum"},"content":"- `CLIENT_INDEX` refers to the index number shown in the displayed client list. The index **must be a positive integer** 1, 2, 3, …​.","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"chewbum"},"content":"- `DATE_TIME` format should be `YYYY-MM-DD HH:MM`, e.g., `2023-01-01 14:00`.","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"chewbum"},"content":"- A meeting can have an optional description(s).","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"chewbum"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"chewbum"},"content":"A meeting can have any number of descriptions (including 0).","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"chewbum"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":165,"author":{"gitId":"chewbum"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":166,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":167,"author":{"gitId":"chewbum"},"content":"- `add 1 n/Project Kickoff dt/2023-03-15 09:00 v/Conference Room d/Initial meeting to discuss project scope`","lastModifiedDate":"2024-02-29"},{"lineNumber":168,"author":{"gitId":"chewbum"},"content":"- `add 2 n/Quarterly Review dt/2023-04-22 11:00 v/Office d/Review last quarter\u0027s performance d/Set next quarter\u0027s objectives`","lastModifiedDate":"2024-02-29"},{"lineNumber":169,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":170,"author":{"gitId":"chewbum"},"content":"### Listing all Meetings for a Client: `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":172,"author":{"gitId":"chewbum"},"content":"Shows a list of all meetings for a specific client.","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"chewbum"},"content":"Format: `list CLIENT_INDEX`","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"chewbum"},"content":"- `CLIENT_INDEX` refers to the index number shown in the displayed client list.","lastModifiedDate":"2024-02-29"},{"lineNumber":177,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":178,"author":{"gitId":"chewbum"},"content":"Example:","lastModifiedDate":"2024-02-29"},{"lineNumber":179,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":180,"author":{"gitId":"chewbum"},"content":"- `list 1` Lists all meetings for the first client.","lastModifiedDate":"2024-02-29"},{"lineNumber":181,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":182,"author":{"gitId":"chewbum"},"content":"### Editing a Meeting: `edit`","lastModifiedDate":"2024-02-29"},{"lineNumber":183,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":184,"author":{"gitId":"chewbum"},"content":"Edits an existing meeting for a client.","lastModifiedDate":"2024-02-29"},{"lineNumber":185,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":186,"author":{"gitId":"chewbum"},"content":"Format: `edit CLIENT_INDEX MEETING_INDEX [n/NAME] [dt/DATE_TIME] [v/VENUE] [d/DESCRIPTION]…​`","lastModifiedDate":"2024-02-29"},{"lineNumber":187,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":188,"author":{"gitId":"chewbum"},"content":"- Edits the meeting specified by `MEETING_INDEX` for the client specified by `CLIENT_INDEX`. Both indexes must be positive integers 1, 2, 3, …​.","lastModifiedDate":"2024-02-29"},{"lineNumber":189,"author":{"gitId":"chewbum"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-02-29"},{"lineNumber":190,"author":{"gitId":"chewbum"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-02-29"},{"lineNumber":191,"author":{"gitId":"chewbum"},"content":"- When editing descriptions, the existing descriptions of the meeting will be removed i.e adding of descriptions is not cumulative.","lastModifiedDate":"2024-02-29"},{"lineNumber":192,"author":{"gitId":"chewbum"},"content":"- You can remove all the meeting’s descriptions by typing `d/` without specifying any descriptions after it.","lastModifiedDate":"2024-02-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":196,"author":{"gitId":"chewbum"},"content":"- `edit 1 2 n/Annual Review dt/2023-12-01 10:00 v/Main Office` Edits the name, date/time, and venue of the 2nd meeting for the 1st client.","lastModifiedDate":"2024-02-29"},{"lineNumber":197,"author":{"gitId":"chewbum"},"content":"- `edit 2 1 n/Budget Meeting d/` Edits the name of the 1st meeting for the 2nd client and clears all existing descriptions.","lastModifiedDate":"2024-02-29"},{"lineNumber":198,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":199,"author":{"gitId":"chewbum"},"content":"### Deleting a Meeting: `delete`","lastModifiedDate":"2024-02-29"},{"lineNumber":200,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":201,"author":{"gitId":"chewbum"},"content":"Deletes a specific meeting for a client.","lastModifiedDate":"2024-02-29"},{"lineNumber":202,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":203,"author":{"gitId":"chewbum"},"content":"Format: `delete CLIENT_INDEX MEETING_INDEX`","lastModifiedDate":"2024-02-29"},{"lineNumber":204,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":205,"author":{"gitId":"chewbum"},"content":"- Deletes the meeting specified by `MEETING_INDEX` for the client specified by `CLIENT_INDEX`. Both indexes must be positive integers 1, 2, 3, …​.","lastModifiedDate":"2024-02-29"},{"lineNumber":206,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":207,"author":{"gitId":"chewbum"},"content":"Example:","lastModifiedDate":"2024-02-29"},{"lineNumber":208,"author":{"gitId":"chewbum"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":209,"author":{"gitId":"chewbum"},"content":"- `delete 3 1` Deletes the first meeting for the third client.","lastModifiedDate":"2024-02-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"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":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":229,"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":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":231,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":232,"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":233,"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":234,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":236,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"timothysashimi"},"content":"**Q**: How do I use the app?\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":245,"author":{"gitId":"timothysashimi"},"content":"**A**: This app is designed to help you keep track of your clients and meetings with them. \u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":246,"author":{"gitId":"timothysashimi"},"content":" To keep track of your clients/meetings, you can follow the various commands in the user guide and enter the commands according to the specified format.","lastModifiedDate":"2024-03-02"},{"lineNumber":247,"author":{"gitId":"timothysashimi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":248,"author":{"gitId":"timothysashimi"},"content":"**Q**: Is there a limit to the number of clients/meetings I can store in the app\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":249,"author":{"gitId":"timothysashimi"},"content":"**A**: No, there is no limit to the number.","lastModifiedDate":"2024-03-02"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":255,"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":256,"author":{"gitId":"timothysashimi"},"content":"2. **When entering a command with an invalid format**, the application will prompt you to re-enter the command while providing the correct format to follow.","lastModifiedDate":"2024-03-02"},{"lineNumber":257,"author":{"gitId":"timothysashimi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":259,"author":{"gitId":"chewbum"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2024-02-27"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":263,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Client Functions","lastModifiedDate":"2024-02-27"},{"lineNumber":264,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":265,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-27"},{"lineNumber":266,"author":{"gitId":"chewbum"},"content":"| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"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":"2024-02-27"},{"lineNumber":268,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **List** | `list`\u003cbr\u003e e.g., `list` |","lastModifiedDate":"2024-02-27"},{"lineNumber":269,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Edit** | `edit CLIENT_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":"2024-02-27"},{"lineNumber":270,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Delete** | `delete CLIENT_INDEX`\u003cbr\u003e e.g., `delete 3` \u003cbr/\u003e |","lastModifiedDate":"2024-02-27"},{"lineNumber":271,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake` |","lastModifiedDate":"2024-02-27"},{"lineNumber":272,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":273,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Meeting Functions","lastModifiedDate":"2024-02-27"},{"lineNumber":274,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":275,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-27"},{"lineNumber":276,"author":{"gitId":"chewbum"},"content":"| ---------- | --------------------------------------------------------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Add** | `add CLIENT_INDEX n/NAME`\u003cbr\u003ee.g., `add 1 n/James Ho` |","lastModifiedDate":"2024-02-27"},{"lineNumber":278,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **List** | `list CLIENT_INDEX`\u003cbr\u003ee.g., `list 2` |","lastModifiedDate":"2024-02-27"},{"lineNumber":279,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Edit** | `edit CLIENT_INDEX MEETING_INDEX`\u003cbr\u003ee.g.,`edit 1 2 n/Jamal Ho` |","lastModifiedDate":"2024-02-27"},{"lineNumber":280,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Delete** | `delete CLIENT_INDEX MEETING_INDEX`\u003cbr\u003ee.g., `delete 3 1` |","lastModifiedDate":"2024-02-27"},{"lineNumber":281,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":282,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### General Functions","lastModifiedDate":"2024-02-27"},{"lineNumber":283,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":284,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-27"},{"lineNumber":285,"author":{"gitId":"chewbum"},"content":"| --------- | ---------------- |","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-02-27"},{"lineNumber":287,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"timothysashimi":8,"chewbum":118,"-":139,"itstrueitstrueitsrealitsreal":22}},{"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":"sethteo"},"content":" content: \"FinCliQ\";","lastModifiedDate":"2024-02-26"},{"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":{"sethteo":1,"-":294}},{"path":"docs/team/kenneth.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"layout: page","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"title: Kenneth Seet\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"### Project: FinCliq","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"FinCliq is a desktop client and meeting tracker application optimised for CLI users.","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"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-27"},{"lineNumber":10,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **New Feature**: Added the ability to delete meetings. ([\\#10](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/10))","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * What it does: allows the user to delete meetings that a client has.","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Justification: This feature is essential to allow financial advisors to manage their client\u0027s meetings.","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Credits: This feature was implemented with reference to AddressBook\u0027s delete feature, but","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" it was a non-trivial task to adapt it to our application\u0027s context.","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # (* **Code contributed**: [RepoSense link]\u0026#40;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **Project management**:","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Managed release [`v1.1`](https://github.com/AY2324S2-CS2103-F08-1/tp/milestone/1) on GitHub","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # (* **Enhancements to existing features**:)","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Updated the GUI color scheme \u0026#40;Pull requests [\\#33]\u0026#40;\u0026#41;, [\\#34]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Wrote additional tests for existing features to increase coverage from 88% to 92% \u0026#40;Pull requests [\\#36]\u0026#40;\u0026#41;, [\\#38]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * User Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Added documentation for command summary: [\\#37](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/37)","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Added the Non-Functional Requirements section: [\\#41](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/41)","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Added the target user profile, value proposition, and user stories: [\\#39](https://github.com/AY2324S2-CS2103-F08-1/tp/issues/39)","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # (* **Community**:)","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * PRs reviewed \u0026#40;with non-trivial review comments\u0026#41;: [\\#12]\u0026#40;\u0026#41;, [\\#32]\u0026#40;\u0026#41;, [\\#19]\u0026#40;\u0026#41;, [\\#42]\u0026#40;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Contributed to forum discussions \u0026#40;examples: [1]\u0026#40;\u0026#41;, [2]\u0026#40;\u0026#41;, [3]\u0026#40;\u0026#41;, [4]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":48,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":49,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Reported bugs and suggestions for other teams in the class \u0026#40;examples: [1]\u0026#40;\u0026#41;, [2]\u0026#40;\u0026#41;, [3]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"[//]: # ( * Some parts of the history feature I added was adopted by several other class mates \u0026#40;[1]\u0026#40;\u0026#41;, [2]\u0026#40;\u0026#41;\u0026#41;)","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":"* **Tools**:","lastModifiedDate":"2024-02-27"},{"lineNumber":54,"author":{"gitId":"itstrueitstrueitsrealitsreal"},"content":" * Integrated CodeCov to the team repo","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"itstrueitstrueitsrealitsreal":54}}] diff --git a/AY2324S2-CS2103-F08-1_tp_master/commits.json b/AY2324S2-CS2103-F08-1_tp_master/commits.json index 1a660d9e..1a83944d 100644 --- a/AY2324S2-CS2103-F08-1_tp_master/commits.json +++ b/AY2324S2-CS2103-F08-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"timothysashimi":[{"date":"2024-03-01","commitResults":[{"hash":"e172cdad527113204f0e4a73585ee2e67eee33f2","isMergeCommit":false,"messageTitle":"Update about us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]},{"date":"2024-03-02","commitResults":[{"hash":"25cd84d9467b481939e8bdbc01cad1f90e11e628","isMergeCommit":false,"messageTitle":"Update User Guide FAQs and Known Issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":2}}},{"hash":"8702d3480664984dc74012ed1efb7e0f214a1c5b","isMergeCommit":true,"messageTitle":"Merge pull request #3 from timothysashimi/branch-userguide","messageBody":"Update User Guide FAQs and Known Issues","fileTypesAndContributionMap":{}}]}],"sethteo":[{"date":"2024-02-26","commitResults":[{"hash":"001e5e0a2e6be8a027fa4556e61967f6f26d7742","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":9}}},{"hash":"defb2bc8e7b5498949e92beca955d8dbdbf18fb3","isMergeCommit":true,"messageTitle":"Merge pull request #50 from sethteo/branch-update-description-readme","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"9fa1b4b65bfe9d5a2058c1cd13587c6bb05e8567","isMergeCommit":false,"messageTitle":"Update link of GitHub actions in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f6d977e2b89d8565bf713f7f1c43025604a08b67","isMergeCommit":true,"messageTitle":"Merge pull request #51 from sethteo/update-ghactions-link","messageBody":"Update link of GitHub actions in README.md","fileTypesAndContributionMap":{}},{"hash":"55c184034fc5836a827e2531a5e58519efd96a6e","isMergeCommit":false,"messageTitle":"Fix README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"3958660e50e059912900a0f9cfa4aa9e21509ea7","isMergeCommit":true,"messageTitle":"Merge pull request #53 from sethteo/fix-readme","messageBody":"Fix README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"0463c0dc8bf3b56204b8264db49113a2e19249cc","isMergeCommit":false,"messageTitle":"Update AboutUs.md (#36)","messageBody":"* Update AboutUs.md\r\nFixes #44 ","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]},{"date":"2024-02-28","commitResults":[{"hash":"bc2201377727b85db16f00881ff36399aa738ecf","isMergeCommit":true,"messageTitle":"Merge pull request #67 from chewbum/branch-aboutpage","messageBody":"Update AboutUs (Zi Xuan)","fileTypesAndContributionMap":{}},{"hash":"1d72d45c5055c1ed13ddee37673428b1422ae48b","isMergeCommit":false,"messageTitle":"Fix naming of image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bc8a970408ec627ac416afdcc56d0d5ce2b37ec5","isMergeCommit":true,"messageTitle":"Merge pull request #68 from sethteo/fix-naming","messageBody":"Fix naming of image","fileTypesAndContributionMap":{}},{"hash":"8b4754f4e1e68d99890b5f0a34121639a285220b","isMergeCommit":false,"messageTitle":"Update user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":8}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2976b08f683dff7359316f5074e21cd759a387fc","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-update-user-stories-in-dg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"78e95c6ad8a0854a78684943798081c4725eb370","isMergeCommit":true,"messageTitle":"Merge pull request #83 from jaejayrome/branch-update-user-stories-in-dg","messageBody":"update user stories in dg","fileTypesAndContributionMap":{}},{"hash":"4eea90fa80f7d6357ea2b673f83e62ed3debf367","isMergeCommit":false,"messageTitle":"Update Timothy name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"963e300a9889d0571ba4f2d22f4b2e197876adf4","isMergeCommit":true,"messageTitle":"Merge pull request #86 from sethteo/update-config-yml","messageBody":"Update config.yml","fileTypesAndContributionMap":{}}]}],"chewbum":[{"date":"2024-02-28","commitResults":[{"hash":"0aaf2e857b1516281c0005e038635a2f83a84335","isMergeCommit":false,"messageTitle":"Update AboutUS","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":12}}}]},{"date":"2024-02-29","commitResults":[{"hash":"8488f47c8c98b4fd90f01fe78d10220ce61a9085","isMergeCommit":false,"messageTitle":"Update UG features","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":122,"deletions":56}}}]},{"date":"2024-03-04","commitResults":[{"hash":"989e0e566dc84794363ec1da70ba2cfcbaa93567","isMergeCommit":false,"messageTitle":"Update DG glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":76}}},{"hash":"76c4c3b4b08d554cdf59a6edba6bdc8387f318e8","isMergeCommit":true,"messageTitle":"Merge pull request #85 from chewbum/branch-DG-glossary","messageBody":"Update DG glossary","fileTypesAndContributionMap":{}}]}],"itstrueitstrueitsrealitsreal":[{"date":"2024-02-27","commitResults":[{"hash":"3b1b4885f8bc0f4a95086dace64d451602361047","isMergeCommit":false,"messageTitle":"Update docs (#54)","messageBody":"Fixes #43\r\n\r\n* Update gradle.yml\r\n\r\n* Update README.md\r\n\r\n* Update gradle.yml\r\n\r\n* Update .gitignore\r\n\r\n* Add image\r\n\r\n* Update kenneth.md\r\n\r\n* Change picture\r\n\r\n* Update gradle.yml\r\n\r\n* Update README.md\r\n\r\n* Update gradle.yml\r\n\r\n* Delete bin files\r\n\r\n* Fix checkstyle\r\n\r\n* Update kenneth.md\r\n\r\n* Update AboutUs.md","fileTypesAndContributionMap":{"docs":{"insertions":60,"deletions":7}}},{"hash":"9f0657325879136d4fd3f9b8dd0c4d2a249035ad","isMergeCommit":false,"messageTitle":"Update ug (#56)","messageBody":"* Update gradle.yml\r\n\r\n* Update README.md\r\n\r\n* Update gradle.yml\r\n\r\n* Update workflow (#1)\r\n\r\n* Update gradle.yml\r\n* Update README.md\r\n\r\n* Update Ui.png for README.md\r\n\r\n* Update README.md\r\n\r\n* Update link of GitHub actions in README.md\r\n\r\n* Update Site-wide settings\r\n\r\n* Fix README.md\r\n\r\n* Update AboutUs.md (#36)\r\n\r\n* Update AboutUs.md\r\nFixes #44\r\n\r\n* Update README.md\r\n\r\n* Update .gitignore\r\n\r\n* Update command summary\r\n\r\n* Update gradle.yml\r\n\r\n* Update workflow (#1)\r\n\r\n* Update gradle.yml\r\n* Update README.md\r\n\r\n* Update README.md\r\n\r\n* Update README.md\r\n\r\n* Fix checkstyle\r\n\r\n* Fix checkstyle\r\n\r\n---------\r\n\r\nCo-authored-by: sethteo \u003chongruiseth.teo@gmail.com\u003e\r\nCo-authored-by: Teo Hong Rui \u003c119569146+sethteo@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"other":{"insertions":580,"deletions":0},"docs":{"insertions":36,"deletions":14}}},{"hash":"93f7cdfba967bee68f65fb6e128aab4107bf2473","isMergeCommit":false,"messageTitle":"Fix typo inm UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":16}}},{"hash":"6bb233a570fa6f28ee70458894f272628f6be51e","isMergeCommit":false,"messageTitle":"Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c11f4ce49c4660fce0fe0378cbf7fd84cfdb115a","isMergeCommit":false,"messageTitle":"Fix typo in UG (#58)","messageBody":"* Fix typo in UG\r\n\r\n* Fix checkstyle","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":12}}},{"hash":"971a3c17eb58f1d15437f0e324c18f160a526926","isMergeCommit":false,"messageTitle":"Add NFRs to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":4}}},{"hash":"6f38be30e56587152015ab05de7eb845e8207fcb","isMergeCommit":true,"messageTitle":"Merge pull request #60","messageBody":"Branch update nfr","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"b9a6c61de6adf9715db22cfcfa211f7d6fb32629","isMergeCommit":false,"messageTitle":"Update user profile, value proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":8}}},{"hash":"8c2554d1de118ee1b49bb4eba437a1eb74d2a34c","isMergeCommit":true,"messageTitle":"Merge pull request #80 from itstrueitstrueitsrealitsreal/branch-user-stories","messageBody":"Branch user stories","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"3a6c4b74c469be83ae28317d53187a24e1804acb","isMergeCommit":true,"messageTitle":"Merge pull request #76 from chewbum/branch-UG-updatefeatures","messageBody":"Update UG features","fileTypesAndContributionMap":{}},{"hash":"92e7b0dbfb2d71bbb4565c2bc01597b2f716ae38","isMergeCommit":true,"messageTitle":"Merge pull request #81 from timothysashimi/master","messageBody":"Update User Guide for FAQs and Known Issues","fileTypesAndContributionMap":{}},{"hash":"7fad830d2edce4318112d75aefbcdb17698351dd","isMergeCommit":true,"messageTitle":"Merge pull request #82 from jaejayrome/branch-about-us","messageBody":"Updated aboutus.md","fileTypesAndContributionMap":{}}]}],"jaejayrome":[{"date":"2024-03-03","commitResults":[{"hash":"61ebd416e867ecf11103f192a19ecca4ec1267e4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103-F08-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"61be98b89efdc4f9c5dad511a712a77d84eb3aad","isMergeCommit":false,"messageTitle":"update aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1ed06b5d15e517597123455e28b1652b4eeefa88","isMergeCommit":false,"messageTitle":"update use cases in the developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":89,"deletions":21}}}]}]},"authorFileTypeContributionMap":{"timothysashimi":{"docs":11,"functional-code":0,"test-code":0},"sethteo":{"docs":28,"functional-code":0,"test-code":0,"other":1},"chewbum":{"docs":195,"functional-code":0,"test-code":0},"itstrueitstrueitsrealitsreal":{"docs":92,"functional-code":0,"test-code":0,"other":580},"jaejayrome":{"docs":93,"functional-code":0,"test-code":0}},"authorContributionVariance":{"timothysashimi":11.416667,"sethteo":104.72222,"chewbum":3911.6384,"itstrueitstrueitsrealitsreal":46312.91,"jaejayrome":1063.6388},"authorDisplayNameMap":{"timothysashimi":"CS2103-F08-1 CHAN..OTHY","sethteo":"CS2103-F08-1 TEO .. RUI","chewbum":"CS2103-F08-1 CHEW..XUAN","itstrueitstrueitsrealitsreal":"CS2103-F08-1 KENN..SEET","jaejayrome":"CS2103-F08-1 JERO..HENG"}} +{"authorDailyContributionsMap":{"timothysashimi":[{"date":"2024-03-01","commitResults":[{"hash":"e172cdad527113204f0e4a73585ee2e67eee33f2","isMergeCommit":false,"messageTitle":"Update about us page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]},{"date":"2024-03-02","commitResults":[{"hash":"25cd84d9467b481939e8bdbc01cad1f90e11e628","isMergeCommit":false,"messageTitle":"Update User Guide FAQs and Known Issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":2}}},{"hash":"8702d3480664984dc74012ed1efb7e0f214a1c5b","isMergeCommit":true,"messageTitle":"Merge pull request #3 from timothysashimi/branch-userguide","messageBody":"Update User Guide FAQs and Known Issues","fileTypesAndContributionMap":{}}]}],"sethteo":[{"date":"2024-02-26","commitResults":[{"hash":"001e5e0a2e6be8a027fa4556e61967f6f26d7742","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":9}}},{"hash":"defb2bc8e7b5498949e92beca955d8dbdbf18fb3","isMergeCommit":true,"messageTitle":"Merge pull request #50 from sethteo/branch-update-description-readme","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"9fa1b4b65bfe9d5a2058c1cd13587c6bb05e8567","isMergeCommit":false,"messageTitle":"Update link of GitHub actions in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f6d977e2b89d8565bf713f7f1c43025604a08b67","isMergeCommit":true,"messageTitle":"Merge pull request #51 from sethteo/update-ghactions-link","messageBody":"Update link of GitHub actions in README.md","fileTypesAndContributionMap":{}},{"hash":"55c184034fc5836a827e2531a5e58519efd96a6e","isMergeCommit":false,"messageTitle":"Fix README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"3958660e50e059912900a0f9cfa4aa9e21509ea7","isMergeCommit":true,"messageTitle":"Merge pull request #53 from sethteo/fix-readme","messageBody":"Fix README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"0463c0dc8bf3b56204b8264db49113a2e19249cc","isMergeCommit":false,"messageTitle":"Update AboutUs.md (#36)","messageBody":"* Update AboutUs.md\r\nFixes #44 ","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]},{"date":"2024-02-28","commitResults":[{"hash":"bc2201377727b85db16f00881ff36399aa738ecf","isMergeCommit":true,"messageTitle":"Merge pull request #67 from chewbum/branch-aboutpage","messageBody":"Update AboutUs (Zi Xuan)","fileTypesAndContributionMap":{}},{"hash":"1d72d45c5055c1ed13ddee37673428b1422ae48b","isMergeCommit":false,"messageTitle":"Fix naming of image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bc8a970408ec627ac416afdcc56d0d5ce2b37ec5","isMergeCommit":true,"messageTitle":"Merge pull request #68 from sethteo/fix-naming","messageBody":"Fix naming of image","fileTypesAndContributionMap":{}},{"hash":"8b4754f4e1e68d99890b5f0a34121639a285220b","isMergeCommit":false,"messageTitle":"Update user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":8}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2976b08f683dff7359316f5074e21cd759a387fc","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-update-user-stories-in-dg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"78e95c6ad8a0854a78684943798081c4725eb370","isMergeCommit":true,"messageTitle":"Merge pull request #83 from jaejayrome/branch-update-user-stories-in-dg","messageBody":"update user stories in dg","fileTypesAndContributionMap":{}},{"hash":"4eea90fa80f7d6357ea2b673f83e62ed3debf367","isMergeCommit":false,"messageTitle":"Update Timothy name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"963e300a9889d0571ba4f2d22f4b2e197876adf4","isMergeCommit":true,"messageTitle":"Merge pull request #86 from sethteo/update-config-yml","messageBody":"Update config.yml","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"f2b3d235695c9be3d5c035d627cdbebab94048d1","isMergeCommit":false,"messageTitle":"Update team images","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2c263929390e3f7c56ab1c20ce600359fa70529d","isMergeCommit":true,"messageTitle":"Merge pull request #87 from sethteo/update-image","messageBody":"Update team images","fileTypesAndContributionMap":{}}]}],"chewbum":[{"date":"2024-02-28","commitResults":[{"hash":"0aaf2e857b1516281c0005e038635a2f83a84335","isMergeCommit":false,"messageTitle":"Update AboutUS","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":12}}}]},{"date":"2024-02-29","commitResults":[{"hash":"8488f47c8c98b4fd90f01fe78d10220ce61a9085","isMergeCommit":false,"messageTitle":"Update UG features","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":122,"deletions":56}}}]},{"date":"2024-03-04","commitResults":[{"hash":"989e0e566dc84794363ec1da70ba2cfcbaa93567","isMergeCommit":false,"messageTitle":"Update DG glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":76}}},{"hash":"76c4c3b4b08d554cdf59a6edba6bdc8387f318e8","isMergeCommit":true,"messageTitle":"Merge pull request #85 from chewbum/branch-DG-glossary","messageBody":"Update DG glossary","fileTypesAndContributionMap":{}}]}],"itstrueitstrueitsrealitsreal":[{"date":"2024-02-27","commitResults":[{"hash":"3b1b4885f8bc0f4a95086dace64d451602361047","isMergeCommit":false,"messageTitle":"Update docs (#54)","messageBody":"Fixes #43\r\n\r\n* Update gradle.yml\r\n\r\n* Update README.md\r\n\r\n* Update gradle.yml\r\n\r\n* Update .gitignore\r\n\r\n* Add image\r\n\r\n* Update kenneth.md\r\n\r\n* Change picture\r\n\r\n* Update gradle.yml\r\n\r\n* Update README.md\r\n\r\n* Update gradle.yml\r\n\r\n* Delete bin files\r\n\r\n* Fix checkstyle\r\n\r\n* Update kenneth.md\r\n\r\n* Update AboutUs.md","fileTypesAndContributionMap":{"docs":{"insertions":60,"deletions":7}}},{"hash":"9f0657325879136d4fd3f9b8dd0c4d2a249035ad","isMergeCommit":false,"messageTitle":"Update ug (#56)","messageBody":"* Update gradle.yml\r\n\r\n* Update README.md\r\n\r\n* Update gradle.yml\r\n\r\n* Update workflow (#1)\r\n\r\n* Update gradle.yml\r\n* Update README.md\r\n\r\n* Update Ui.png for README.md\r\n\r\n* Update README.md\r\n\r\n* Update link of GitHub actions in README.md\r\n\r\n* Update Site-wide settings\r\n\r\n* Fix README.md\r\n\r\n* Update AboutUs.md (#36)\r\n\r\n* Update AboutUs.md\r\nFixes #44\r\n\r\n* Update README.md\r\n\r\n* Update .gitignore\r\n\r\n* Update command summary\r\n\r\n* Update gradle.yml\r\n\r\n* Update workflow (#1)\r\n\r\n* Update gradle.yml\r\n* Update README.md\r\n\r\n* Update README.md\r\n\r\n* Update README.md\r\n\r\n* Fix checkstyle\r\n\r\n* Fix checkstyle\r\n\r\n---------\r\n\r\nCo-authored-by: sethteo \u003chongruiseth.teo@gmail.com\u003e\r\nCo-authored-by: Teo Hong Rui \u003c119569146+sethteo@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"other":{"insertions":580,"deletions":0},"docs":{"insertions":36,"deletions":14}}},{"hash":"93f7cdfba967bee68f65fb6e128aab4107bf2473","isMergeCommit":false,"messageTitle":"Fix typo inm UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":16}}},{"hash":"6bb233a570fa6f28ee70458894f272628f6be51e","isMergeCommit":false,"messageTitle":"Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c11f4ce49c4660fce0fe0378cbf7fd84cfdb115a","isMergeCommit":false,"messageTitle":"Fix typo in UG (#58)","messageBody":"* Fix typo in UG\r\n\r\n* Fix checkstyle","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":12}}},{"hash":"971a3c17eb58f1d15437f0e324c18f160a526926","isMergeCommit":false,"messageTitle":"Add NFRs to developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":4}}},{"hash":"6f38be30e56587152015ab05de7eb845e8207fcb","isMergeCommit":true,"messageTitle":"Merge pull request #60","messageBody":"Branch update nfr","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"b9a6c61de6adf9715db22cfcfa211f7d6fb32629","isMergeCommit":false,"messageTitle":"Update user profile, value proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":8}}},{"hash":"8c2554d1de118ee1b49bb4eba437a1eb74d2a34c","isMergeCommit":true,"messageTitle":"Merge pull request #80 from itstrueitstrueitsrealitsreal/branch-user-stories","messageBody":"Branch user stories","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"3a6c4b74c469be83ae28317d53187a24e1804acb","isMergeCommit":true,"messageTitle":"Merge pull request #76 from chewbum/branch-UG-updatefeatures","messageBody":"Update UG features","fileTypesAndContributionMap":{}},{"hash":"92e7b0dbfb2d71bbb4565c2bc01597b2f716ae38","isMergeCommit":true,"messageTitle":"Merge pull request #81 from timothysashimi/master","messageBody":"Update User Guide for FAQs and Known Issues","fileTypesAndContributionMap":{}},{"hash":"7fad830d2edce4318112d75aefbcdb17698351dd","isMergeCommit":true,"messageTitle":"Merge pull request #82 from jaejayrome/branch-about-us","messageBody":"Updated aboutus.md","fileTypesAndContributionMap":{}}]}],"jaejayrome":[{"date":"2024-03-03","commitResults":[{"hash":"61ebd416e867ecf11103f192a19ecca4ec1267e4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103-F08-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"61be98b89efdc4f9c5dad511a712a77d84eb3aad","isMergeCommit":false,"messageTitle":"update aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1ed06b5d15e517597123455e28b1652b4eeefa88","isMergeCommit":false,"messageTitle":"update use cases in the developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":89,"deletions":21}}}]}]},"authorFileTypeContributionMap":{"timothysashimi":{"docs":11,"functional-code":0,"test-code":0},"sethteo":{"docs":29,"functional-code":0,"test-code":0,"other":1},"chewbum":{"docs":195,"functional-code":0,"test-code":0},"itstrueitstrueitsrealitsreal":{"docs":92,"functional-code":0,"test-code":0,"other":580},"jaejayrome":{"docs":93,"functional-code":0,"test-code":0}},"authorContributionVariance":{"timothysashimi":10.698226,"sethteo":97.455605,"chewbum":3675.3608,"itstrueitstrueitsrealitsreal":43063.598,"jaejayrome":988.68646},"authorDisplayNameMap":{"timothysashimi":"CS2103-F08-1 CHAN..OTHY","sethteo":"CS2103-F08-1 TEO .. RUI","chewbum":"CS2103-F08-1 CHEW..XUAN","itstrueitstrueitsrealitsreal":"CS2103-F08-1 KENN..SEET","jaejayrome":"CS2103-F08-1 JERO..HENG"}} diff --git a/AY2324S2-CS2103-F08-2_tp_master/authorship.json b/AY2324S2-CS2103-F08-2_tp_master/authorship.json index e0aee566..f668cf99 100644 --- a/AY2324S2-CS2103-F08-2_tp_master/authorship.json +++ b/AY2324S2-CS2103-F08-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":".github/ISSUE_TEMPLATE/bug_report.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"tankh99"},"content":"name: Bug report","lastModifiedDate":"2024-02-26"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":"about: Create a report to help us improve","lastModifiedDate":"2024-02-26"},{"lineNumber":4,"author":{"gitId":"tankh99"},"content":"title: \u0027\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":5,"author":{"gitId":"tankh99"},"content":"labels: \u0027\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"tankh99"},"content":"assignees: \u0027\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"tankh99"},"content":"**Describe the bug**","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"tankh99"},"content":"A clear and concise description of what the bug is.","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"tankh99"},"content":"**To Reproduce**","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"tankh99"},"content":"Steps to reproduce the behavior:","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"tankh99"},"content":"1. Go to \u0027...\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"tankh99"},"content":"2. Click on \u0027....\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"tankh99"},"content":"3. Scroll down to \u0027....\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"tankh99"},"content":"4. See error","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"tankh99"},"content":"**Expected behavior**","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"tankh99"},"content":"A clear and concise description of what you expected to happen.","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"tankh99"},"content":"**Screenshots**","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"tankh99"},"content":"If applicable, add screenshots to help explain your problem.","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"tankh99"},"content":"**Additional context**","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"tankh99"},"content":"Add any other context about the problem here.","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"tankh99":27}},{"path":".github/ISSUE_TEMPLATE/user-story.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"tankh99"},"content":"name: User story","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":"about: User story","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"tankh99"},"content":"title: \"As a\"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"tankh99"},"content":"labels: \u0027\u0027","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"tankh99"},"content":"assignees: \u0027\u0027","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"tankh99"},"content":"...so that","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"tankh99":10}},{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":"[![CI Status](https://https://github.com/AY2324S2-CS2103-F08-2/tp/workflows/Java%20CI/badge.svg)](https://https://github.com/AY2324S2-CS2103-F08-2/tp/actions)","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**. pu\u003cbr\u003e","lastModifiedDate":"2024-02-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"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":12,"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":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":{"tankh99":1,"-":15}},{"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":"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":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"Jerome-j"},"content":"### Jerome Chua","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Jerome-j"},"content":"\u003cimg src\u003d\"images/jerome-j.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Jerome-j"},"content":"[[github](http://github.com/Jerome-j] [[portfolio](team/jerome-j.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jerome-j"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"caitlyntang"},"content":"### Caitlyn Tang","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"caitlyntang"},"content":"\u003cimg src\u003d\"images/caitlyntang.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"caitlyntang"},"content":"[[github](http://github.com/caitlyntang)]","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"caitlyntang"},"content":"[[portfolio](team/caitlyntang.md)]","lastModifiedDate":"2024-03-04"},{"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":"tankh99"},"content":"### Tan Khang Hou","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"tankh99"},"content":"\u003cimg src\u003d\"images/tankh99.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"tankh99"},"content":"[[github](http://github.com/tankh99)]","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"tankh99"},"content":"[[portfolio](team/tankh99.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"tankh99"},"content":"* Responsibilities: Code quality","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"caitlyntang":4,"Jerome-j":4,"tankh99":5,"-":46}},{"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":"Jerome-j"},"content":"* Staff at SoC Center for Future Graduates (CFG)","lastModifiedDate":"2024-03-05"},{"lineNumber":277,"author":{"gitId":"Jerome-j"},"content":"* has a need to manage a significant number of contacts due to the large number of students requiring counselling services","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"* only a single user","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"Jerome-j"},"content":"**Value proposition**: Manage students that are being counselled by him faster than a typical mouse/GUI application.","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"Priorities: High (must have) - `* * * *`, Medium (nice to have) - `* * *`, Low (unlikely to have) - `* *`, Not essential (implement only if got time) - ` * `","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"|-----------|------------------|-------------------------------------------|-------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | create new patients | store their data for future sessions. |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | view patient data | view their contact information and contact them. |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | delete patient data at a given index | discharge the patient. |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | search for a patient | quickly access and review patient status. |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | list patient at the given index | quickly access patients that come regularly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"Jerome-j"},"content":"| `* * *` | Counsellor | to categorise / tag my patients | patients with more serious issues can be attended to first. |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"Jerome-j"},"content":"| `* * *` | New User | have a help function | so that I know how to use the application. |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"Jerome-j"},"content":"| `* *` | Counsellor | sort patients based on their priority tag | more serious patients can be attended first. |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"Jerome-j"},"content":"| `*` | Experienced User | mass delete patient data | patient data is not compromised. |","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"(For all use cases below, the **System** is the `CogniCare` application and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"Jerome-j"},"content":"**Use case: Search a student**","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"1. User requests to list persons using the specified constraints","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"Jerome-j"},"content":"2. CogniCare shows a list of persons that meets the criteria","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"* 1a. The query has missing parameters","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"Jerome-j"},"content":" * 1a1. CogniCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"Jerome-j"},"content":" * 1a2. CogniCare returns all information about a patient.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"Jerome-j"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"Jerome-j"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"Jerome-j"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"Jerome-j"},"content":"1. User requests to delete a patient at the given index.","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"Jerome-j"},"content":"2. CogniCare displays the patient information prior to deletion, and confirms with the user prior to deletion.","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"Jerome-j"},"content":"3. CogniCare deletes the patient.","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"Jerome-j"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"Jerome-j"},"content":"* 1a. The query has missing parameters","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"Jerome-j"},"content":" * 1a1. CogniCare shows an error message that the index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Jerome-j"},"content":"* 2a. User does not want to delete.","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Jerome-j"},"content":" * 1a1. CogniCare shows an error message that the user cancelled the delete operation.","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Jerome-j"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"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":360,"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":361,"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":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"Jerome-j"},"content":"* **Mainstream OS**: Windows, Linux, Unix, macOS","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":378,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":379,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Jerome-j":51,"-":372}},{"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":"Jerome-j"},"content":"# CogniCare","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"tankh99"},"content":"[![CI Status](https://https://github.com/AY2324S2-CS2103-F08-2/tp/workflows/Java%20CI/badge.svg)](https://https://github.com/AY2324S2-CS2103-F08-2/tp/actions)","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"tankh99"},"content":"[![codecov](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"**CogniCare is a desktop application for managing all the students that you are currently handling.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"Jerome-j"},"content":"* If you are interested in using CogniCare, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-01"},{"lineNumber":16,"author":{"gitId":"Jerome-j"},"content":"* If you are interested about developing CogniCare, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-01"},{"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"},{"lineNumber":22,"author":{"gitId":"Jerome-j"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"Jerome-j":6,"tankh99":2,"-":15}},{"path":"docs/team/caitlyntang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"caitlyntang"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"caitlyntang"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"caitlyntang"},"content":" title: \"Caitlyn\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"caitlyntang"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"caitlyntang"},"content":"### Caitlyn\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":9,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"caitlyntang"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"caitlyntang"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":14,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":15,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":16,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":17,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"caitlyntang"},"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":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"caitlyntang"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"caitlyntang"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"caitlyntang"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"caitlyntang"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"caitlyntang"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"caitlyntang"},"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":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"caitlyntang"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"caitlyntang"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"caitlyntang"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"caitlyntang"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"caitlyntang"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"caitlyntang"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"caitlyntang"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"caitlyntang"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"caitlyntang"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"caitlyntang"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"caitlyntang"},"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":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"caitlyntang"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"caitlyntang"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"caitlyntang"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"caitlyntang"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"caitlyntang":46}},{"path":"docs/team/jerome-j.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Jerome-j"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"Jerome-j"},"content":" layout: default.md","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"Jerome-j"},"content":" title: \"Jerome-j\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"Jerome-j"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"Jerome-j"},"content":"### Jerome-j\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":9,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"Jerome-j"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"Jerome-j"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":14,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":15,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":16,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":17,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"Jerome-j"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"Jerome-j"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"Jerome-j"},"content":"* **Project management**:","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"Jerome-j"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"Jerome-j"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-01"},{"lineNumber":26,"author":{"gitId":"Jerome-j"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"Jerome-j"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"Jerome-j"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"Jerome-j"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"Jerome-j"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"Jerome-j"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"Jerome-j"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"Jerome-j"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"Jerome-j"},"content":"* **Community**:","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"Jerome-j"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"Jerome-j"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-01"},{"lineNumber":39,"author":{"gitId":"Jerome-j"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"Jerome-j"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"Jerome-j"},"content":"* **Tools**:","lastModifiedDate":"2024-03-01"},{"lineNumber":43,"author":{"gitId":"Jerome-j"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"Jerome-j"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":46,"author":{"gitId":"Jerome-j"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"Jerome-j":46}},{"path":"docs/team/tankh99.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"tankh99"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":" title: \"Khang Hou\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"tankh99"},"content":"### Khang Hou\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"tankh99"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"tankh99"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"tankh99"},"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":"tankh99"},"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":"tankh99"},"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":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"tankh99"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"tankh99"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"tankh99"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"tankh99"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"tankh99"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"tankh99"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"tankh99"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"tankh99"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"tankh99"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"tankh99"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"tankh99"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"tankh99"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"tankh99"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"tankh99"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"tankh99"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"tankh99"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"tankh99"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"tankh99"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"tankh99"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"tankh99":46}}] +[{"path":".github/ISSUE_TEMPLATE/bug_report.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"tankh99"},"content":"name: Bug report","lastModifiedDate":"2024-02-26"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":"about: Create a report to help us improve","lastModifiedDate":"2024-02-26"},{"lineNumber":4,"author":{"gitId":"tankh99"},"content":"title: \u0027\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":5,"author":{"gitId":"tankh99"},"content":"labels: \u0027\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"tankh99"},"content":"assignees: \u0027\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"tankh99"},"content":"**Describe the bug**","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"tankh99"},"content":"A clear and concise description of what the bug is.","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"tankh99"},"content":"**To Reproduce**","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"tankh99"},"content":"Steps to reproduce the behavior:","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"tankh99"},"content":"1. Go to \u0027...\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":16,"author":{"gitId":"tankh99"},"content":"2. Click on \u0027....\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"tankh99"},"content":"3. Scroll down to \u0027....\u0027","lastModifiedDate":"2024-02-26"},{"lineNumber":18,"author":{"gitId":"tankh99"},"content":"4. See error","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":20,"author":{"gitId":"tankh99"},"content":"**Expected behavior**","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"tankh99"},"content":"A clear and concise description of what you expected to happen.","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":23,"author":{"gitId":"tankh99"},"content":"**Screenshots**","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"tankh99"},"content":"If applicable, add screenshots to help explain your problem.","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"tankh99"},"content":"**Additional context**","lastModifiedDate":"2024-02-26"},{"lineNumber":27,"author":{"gitId":"tankh99"},"content":"Add any other context about the problem here.","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"tankh99":27}},{"path":".github/ISSUE_TEMPLATE/user-story.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"tankh99"},"content":"name: User story","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":"about: User story","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"tankh99"},"content":"title: \"As a\"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"tankh99"},"content":"labels: \u0027\u0027","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"tankh99"},"content":"assignees: \u0027\u0027","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"tankh99"},"content":"...so that","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"tankh99":10}},{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**. pu\u003cbr\u003e","lastModifiedDate":"2024-02-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"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":12,"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":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":{"tankh99":1,"-":15}},{"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":"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":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"Jerome-j"},"content":"### Jerome Chua","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Jerome-j"},"content":"\u003cimg src\u003d\"images/jerome-j.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Jerome-j"},"content":"[[github](http://github.com/Jerome-j)] [[portfolio](team/jerome-j.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":"Jerome-j"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"caitlyntang"},"content":"### Caitlyn Tang","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"caitlyntang"},"content":"\u003cimg src\u003d\"images/caitlyntang.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"caitlyntang"},"content":"[[github](http://github.com/caitlyntang)]","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"caitlyntang"},"content":"[[portfolio](team/caitlyntang.md)]","lastModifiedDate":"2024-03-04"},{"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":"tankh99"},"content":"### Tan Khang Hou","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"tankh99"},"content":"\u003cimg src\u003d\"images/tankh99.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"tankh99"},"content":"[[github](http://github.com/tankh99)]","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"tankh99"},"content":"[[portfolio](team/tankh99.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"tankh99"},"content":"* Responsibilities: Code quality","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"caitlyntang":4,"Jerome-j":4,"tankh99":5,"-":46}},{"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":"Jerome-j"},"content":"* Staff at SoC Center for Future Graduates (CFG)","lastModifiedDate":"2024-03-05"},{"lineNumber":277,"author":{"gitId":"Jerome-j"},"content":"* has a need to manage a significant number of contacts due to the large number of students requiring counselling services","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"* only a single user","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"Jerome-j"},"content":"**Value proposition**: Manage students that are being counselled by him faster than a typical mouse/GUI application.","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"Priorities: High (must have) - `* * * *`, Medium (nice to have) - `* * *`, Low (unlikely to have) - `* *`, Not essential (implement only if got time) - ` * `","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"|-----------|------------------|-------------------------------------------|-------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | create new patients | store their data for future sessions. |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | view patient data | view their contact information and contact them. |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | delete patient data at a given index | discharge the patient. |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | search for a patient | quickly access and review patient status. |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"Jerome-j"},"content":"| `* * * *` | Counsellor | list patient at the given index | quickly access patients that come regularly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"Jerome-j"},"content":"| `* * *` | Counsellor | to categorise / tag my patients | patients with more serious issues can be attended to first. |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"Jerome-j"},"content":"| `* * *` | New User | have a help function | so that I know how to use the application. |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"Jerome-j"},"content":"| `* *` | Counsellor | sort patients based on their priority tag | more serious patients can be attended first. |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"Jerome-j"},"content":"| `*` | Experienced User | mass delete patient data | patient data is not compromised. |","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"(For all use cases below, the **System** is the `CogniCare` application and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"Jerome-j"},"content":"**Use case: Search a student**","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"1. User requests to list persons using the specified constraints","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"Jerome-j"},"content":"2. CogniCare shows a list of persons that meets the criteria","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"* 1a. The query has missing parameters","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"Jerome-j"},"content":" * 1a1. CogniCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"Jerome-j"},"content":" * 1a2. CogniCare returns all information about a patient.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"Jerome-j"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"Jerome-j"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"Jerome-j"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"Jerome-j"},"content":"1. User requests to delete a patient at the given index.","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"Jerome-j"},"content":"2. CogniCare displays the patient information prior to deletion, and confirms with the user prior to deletion.","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"Jerome-j"},"content":"3. CogniCare deletes the patient.","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"Jerome-j"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"Jerome-j"},"content":"* 1a. The query has missing parameters","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"Jerome-j"},"content":" * 1a1. CogniCare shows an error message that the index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Jerome-j"},"content":"* 2a. User does not want to delete.","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Jerome-j"},"content":" * 1a1. CogniCare shows an error message that the user cancelled the delete operation.","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Jerome-j"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"Jerome-j"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"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":360,"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":361,"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":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"Jerome-j"},"content":"* **Mainstream OS**: Windows, Linux, Unix, macOS","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":378,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":379,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Jerome-j":51,"-":372}},{"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":"Jerome-j"},"content":"# CogniCare","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"tankh99"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F08-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F08-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"tankh99"},"content":"[![codecov](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)","lastModifiedDate":"2024-03-05"},{"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":"Jerome-j"},"content":"**CogniCare is a desktop application for managing all the students that you are currently handling.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"Jerome-j"},"content":"* If you are interested in using CogniCare, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-01"},{"lineNumber":16,"author":{"gitId":"Jerome-j"},"content":"* If you are interested about developing CogniCare, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-01"},{"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"},{"lineNumber":22,"author":{"gitId":"Jerome-j"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"Jerome-j":6,"tankh99":2,"-":15}},{"path":"docs/team/caitlyntang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"caitlyntang"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"caitlyntang"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"caitlyntang"},"content":" title: \"Caitlyn\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"caitlyntang"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"caitlyntang"},"content":"### Caitlyn\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":9,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"caitlyntang"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"caitlyntang"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":14,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":15,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":16,"author":{"gitId":"caitlyntang"},"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-04"},{"lineNumber":17,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"caitlyntang"},"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":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"caitlyntang"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"caitlyntang"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"caitlyntang"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"caitlyntang"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"caitlyntang"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"caitlyntang"},"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":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"caitlyntang"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"caitlyntang"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"caitlyntang"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"caitlyntang"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"caitlyntang"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"caitlyntang"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"caitlyntang"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"caitlyntang"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"caitlyntang"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"caitlyntang"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"caitlyntang"},"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":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"caitlyntang"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"caitlyntang"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"caitlyntang"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"caitlyntang"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"caitlyntang"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"caitlyntang":46}},{"path":"docs/team/jerome-j.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Jerome-j"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"Jerome-j"},"content":" layout: default.md","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"Jerome-j"},"content":" title: \"Jerome-j\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"Jerome-j"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"Jerome-j"},"content":"### Jerome-j\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":9,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"Jerome-j"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"Jerome-j"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":14,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":15,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":16,"author":{"gitId":"Jerome-j"},"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-01"},{"lineNumber":17,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"Jerome-j"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"Jerome-j"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"Jerome-j"},"content":"* **Project management**:","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"Jerome-j"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"Jerome-j"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-01"},{"lineNumber":26,"author":{"gitId":"Jerome-j"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"Jerome-j"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"Jerome-j"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"Jerome-j"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"Jerome-j"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"Jerome-j"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"Jerome-j"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"Jerome-j"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"Jerome-j"},"content":"* **Community**:","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"Jerome-j"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"Jerome-j"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-01"},{"lineNumber":39,"author":{"gitId":"Jerome-j"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"Jerome-j"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"Jerome-j"},"content":"* **Tools**:","lastModifiedDate":"2024-03-01"},{"lineNumber":43,"author":{"gitId":"Jerome-j"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"Jerome-j"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"Jerome-j"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":46,"author":{"gitId":"Jerome-j"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"Jerome-j":46}},{"path":"docs/team/tankh99.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"tankh99"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"tankh99"},"content":" title: \"Khang Hou\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"tankh99"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"tankh99"},"content":"### Khang Hou\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"tankh99"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"tankh99"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"tankh99"},"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":"tankh99"},"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":"tankh99"},"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":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"tankh99"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"tankh99"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"tankh99"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"tankh99"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"tankh99"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"tankh99"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"tankh99"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"tankh99"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"tankh99"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"tankh99"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"tankh99"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"tankh99"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"tankh99"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"tankh99"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"tankh99"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"tankh99"},"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":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"tankh99"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"tankh99"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"tankh99"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"tankh99"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"tankh99"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"tankh99":46}}] diff --git a/AY2324S2-CS2103-F08-2_tp_master/commits.json b/AY2324S2-CS2103-F08-2_tp_master/commits.json index c53482ad..c978cf4e 100644 --- a/AY2324S2-CS2103-F08-2_tp_master/commits.json +++ b/AY2324S2-CS2103-F08-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"caitlyntang":[{"date":"2024-03-04","commitResults":[{"hash":"be4075943c44c456b2eb5b8879d65ba1cf2b4b7e","isMergeCommit":false,"messageTitle":"Add Caitlyn information, update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"6c13c7a92451cfb27c4a827c7e67ec06823baf67","isMergeCommit":true,"messageTitle":"Merge pull request #20 from caitlyntang/caitlyntang/add-caitlyntang-info","messageBody":"Add Caitlyn information","fileTypesAndContributionMap":{}}]}],"Jerome-j":[{"date":"2024-03-01","commitResults":[{"hash":"2a69b9b4868675fdc0abb39d77a25f05f00061a2","isMergeCommit":false,"messageTitle":"Add Jerome information page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":7}}},{"hash":"3b871f00b6e913811d4bbd4447347d931a281f04","isMergeCommit":false,"messageTitle":"Add Jerome information page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"90de2d72d756266ca6fc1b92636a3f17ccf554a4","isMergeCommit":false,"messageTitle":"Add screenshot for CogniCare index","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}}]},{"date":"2024-03-02","commitResults":[{"hash":"3bc5aaf2e1d0f122060bd57d8ca0052be10dcaec","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Jerome-j/add-jeromeChua-info","messageBody":"Add Jerome-j info","fileTypesAndContributionMap":{}},{"hash":"0712e6905909aede28d96dbd84ff0fd6f6636e50","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Jerome-j/jerome-j/update-index","messageBody":"Add screenshot for CogniCare index","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"df2df68b93c9f6fd045812af0de91558b23f5d39","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":25}}},{"hash":"d67ef15ad0ce42f4375210766379db1819563a82","isMergeCommit":true,"messageTitle":"Merge pull request #32 from Jerome-j/jerome-j/add-dg","messageBody":"Update DG","fileTypesAndContributionMap":{}}]}],"tankh99":[{"date":"2024-02-26","commitResults":[{"hash":"17ef9adbf5e557a9d7dbb352f07f4a17451ab5a4","isMergeCommit":false,"messageTitle":"Update issue templates","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":0}}},{"hash":"b707a6cc312ca65b255beda6807162facb9d6a4c","isMergeCommit":false,"messageTitle":"Update issue templates","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":0}}},{"hash":"7e9c54af395635429755c7a55e2c95a045cea04b","isMergeCommit":true,"messageTitle":"Merge pull request #11 from AY2324S2-CS2103-F08-2/tankh99-patch-1","messageBody":"Update issue templates","fileTypesAndContributionMap":{}},{"hash":"ac9c8df224d66c77e4f0b2ac3af7036940cd293f","isMergeCommit":false,"messageTitle":"Update issue templates","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]},{"date":"2024-03-05","commitResults":[{"hash":"6486caa3bf855ef9e65845e92bb83725c6dc618c","isMergeCommit":false,"messageTitle":"Add member info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"9e54d458da6e716c421bbdad00e2f29e2c981578","isMergeCommit":true,"messageTitle":"Merge pull request #22 from tankh99/tankh99/add-info","messageBody":"Add member info","fileTypesAndContributionMap":{}},{"hash":"93dfa382aba3c69b7911f1ce66cb02f8177c3c93","isMergeCommit":false,"messageTitle":"Update codecov and CI links","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-06","commitResults":[{"hash":"95504f2b217ed0b5ba66b420e6c3cded94810f17","isMergeCommit":true,"messageTitle":"Merge pull request #31 from tankh99/update-readme-links","messageBody":"Update readme links","fileTypesAndContributionMap":{}},{"hash":"b0df7d5de3a9c0f6bd50e005d5dbec2551a91c5f","isMergeCommit":false,"messageTitle":"Update and rename new-feature.md to user-story.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":16}}}]}],"vnnamng":[]},"authorFileTypeContributionMap":{"caitlyntang":{"docs":50,"functional-code":0,"test-code":0},"Jerome-j":{"docs":107,"functional-code":0,"test-code":0},"tankh99":{"docs":91,"functional-code":0,"test-code":0},"vnnamng":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"caitlyntang":207.05324,"Jerome-j":705.13605,"tankh99":446.13025,"vnnamng":0.0},"authorDisplayNameMap":{"caitlyntang":"CS2103-F08-2 TANG..TLYN","Jerome-j":"CS2103-F08-2 JERO.. JIE","tankh99":"CS2103-F08-2 TAN .. HOU","vnnamng":"CS2103-F08-2 NGUY.. NAM"}} +{"authorDailyContributionsMap":{"caitlyntang":[{"date":"2024-03-04","commitResults":[{"hash":"be4075943c44c456b2eb5b8879d65ba1cf2b4b7e","isMergeCommit":false,"messageTitle":"Add Caitlyn information, update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":4}}},{"hash":"6c13c7a92451cfb27c4a827c7e67ec06823baf67","isMergeCommit":true,"messageTitle":"Merge pull request #20 from caitlyntang/caitlyntang/add-caitlyntang-info","messageBody":"Add Caitlyn information","fileTypesAndContributionMap":{}}]}],"Jerome-j":[{"date":"2024-03-01","commitResults":[{"hash":"2a69b9b4868675fdc0abb39d77a25f05f00061a2","isMergeCommit":false,"messageTitle":"Add Jerome information page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":7}}},{"hash":"3b871f00b6e913811d4bbd4447347d931a281f04","isMergeCommit":false,"messageTitle":"Add Jerome information page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"90de2d72d756266ca6fc1b92636a3f17ccf554a4","isMergeCommit":false,"messageTitle":"Add screenshot for CogniCare index","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}}]},{"date":"2024-03-02","commitResults":[{"hash":"3bc5aaf2e1d0f122060bd57d8ca0052be10dcaec","isMergeCommit":true,"messageTitle":"Merge pull request #18 from Jerome-j/add-jeromeChua-info","messageBody":"Add Jerome-j info","fileTypesAndContributionMap":{}},{"hash":"0712e6905909aede28d96dbd84ff0fd6f6636e50","isMergeCommit":true,"messageTitle":"Merge pull request #19 from Jerome-j/jerome-j/update-index","messageBody":"Add screenshot for CogniCare index","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"df2df68b93c9f6fd045812af0de91558b23f5d39","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":25}}},{"hash":"d67ef15ad0ce42f4375210766379db1819563a82","isMergeCommit":true,"messageTitle":"Merge pull request #32 from Jerome-j/jerome-j/add-dg","messageBody":"Update DG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"444cdc802bbc664b3b2b5d923238db10381f3a42","isMergeCommit":true,"messageTitle":"Merge pull request #36 from AY2324S2-CS2103-F08-2/fix-links","messageBody":"Fix links","fileTypesAndContributionMap":{}},{"hash":"6a9f4b2d64546687f1968d5dfdf998499e8d6408","isMergeCommit":false,"messageTitle":"Fix hyperlink","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b82b172b047ed116af0f37916d3429933af786bb","isMergeCommit":true,"messageTitle":"Merge pull request #47 from Jerome-j/jerome-j/fix-hyperlink","messageBody":"Fix hyperlink for my own profile","fileTypesAndContributionMap":{}}]}],"tankh99":[{"date":"2024-02-26","commitResults":[{"hash":"17ef9adbf5e557a9d7dbb352f07f4a17451ab5a4","isMergeCommit":false,"messageTitle":"Update issue templates","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":0}}},{"hash":"b707a6cc312ca65b255beda6807162facb9d6a4c","isMergeCommit":false,"messageTitle":"Update issue templates","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":0}}},{"hash":"7e9c54af395635429755c7a55e2c95a045cea04b","isMergeCommit":true,"messageTitle":"Merge pull request #11 from AY2324S2-CS2103-F08-2/tankh99-patch-1","messageBody":"Update issue templates","fileTypesAndContributionMap":{}},{"hash":"ac9c8df224d66c77e4f0b2ac3af7036940cd293f","isMergeCommit":false,"messageTitle":"Update issue templates","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]},{"date":"2024-03-05","commitResults":[{"hash":"6486caa3bf855ef9e65845e92bb83725c6dc618c","isMergeCommit":false,"messageTitle":"Add member info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"9e54d458da6e716c421bbdad00e2f29e2c981578","isMergeCommit":true,"messageTitle":"Merge pull request #22 from tankh99/tankh99/add-info","messageBody":"Add member info","fileTypesAndContributionMap":{}},{"hash":"93dfa382aba3c69b7911f1ce66cb02f8177c3c93","isMergeCommit":false,"messageTitle":"Update codecov and CI links","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-06","commitResults":[{"hash":"95504f2b217ed0b5ba66b420e6c3cded94810f17","isMergeCommit":true,"messageTitle":"Merge pull request #31 from tankh99/update-readme-links","messageBody":"Update readme links","fileTypesAndContributionMap":{}},{"hash":"5feb770e93f2a944d2e4b2f8a6b817781d7b3891","isMergeCommit":false,"messageTitle":"Fix links","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"b0df7d5de3a9c0f6bd50e005d5dbec2551a91c5f","isMergeCommit":false,"messageTitle":"Update and rename new-feature.md to user-story.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":16}}}]}],"vnnamng":[]},"authorFileTypeContributionMap":{"caitlyntang":{"docs":50,"functional-code":0,"test-code":0},"Jerome-j":{"docs":107,"functional-code":0,"test-code":0},"tankh99":{"docs":91,"functional-code":0,"test-code":0},"vnnamng":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"caitlyntang":207.05324,"Jerome-j":701.94073,"tankh99":456.59167,"vnnamng":0.0},"authorDisplayNameMap":{"caitlyntang":"CS2103-F08-2 TANG..TLYN","Jerome-j":"CS2103-F08-2 JERO.. JIE","tankh99":"CS2103-F08-2 TAN .. HOU","vnnamng":"CS2103-F08-2 NGUY.. NAM"}} diff --git a/AY2324S2-CS2103-F09-1_tp_master/authorship.json b/AY2324S2-CS2103-F09-1_tp_master/authorship.json index 4fa25b6f..008e35f7 100644 --- a/AY2324S2-CS2103-F09-1_tp_master/authorship.json +++ b/AY2324S2-CS2103-F09-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"felixchanyy"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F09-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp/graph/badge.svg?token\u003dNB86I9H23Z)](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp)","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"## About the app","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"felixchanyy"},"content":"EstateEase simplifies residential property management for real estate listing agents in Singapore.","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"felixchanyy"},"content":"### Key Features:","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"felixchanyy"},"content":" * With intuitive tools for listing and client communication, the app is tailored for efficiency. ","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"felixchanyy"},"content":" * Agents can quickly access contacts and prioritize them, ensuring swift connections with clients. ","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"felixchanyy"},"content":"### Example Usages:","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to add and delete client information.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to prioritize client contacts for efficient communication","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to load and save the list using JSON file","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"This project is based on the AddressBook-Level3 project created by the ","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":17,"-":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":"felixchanyy"},"content":"You can reach us at the email `felixchanyy.22@u.nus.edu`","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"### Felix Chan","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/felixchanyy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"[[homepage](https://nus-cs2103-ay2324s2.github.io/website)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"[[github](https://github.com/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"felixchanyy"},"content":"* Role: Team Lead, Scheduling and Tracking, Git Expert","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for overall project coordination, in charge of defining, assigning, and tracking ","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"felixchanyy"},"content":"project tasks, helps other team members with matters related to Git","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"felixchanyy"},"content":"### Yek Khoon Sun","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/khoonsun47.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/khoonsun47)]","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://sg.linkedin.com/in/yek-khoon-sun-2b2270177)]","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"felixchanyy"},"content":"* Role: Testing","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensures the testing of the project is done properly and on time","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"felixchanyy"},"content":"### Carl Lim","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/lokidoki102.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/lokidoki102)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/carl-lim-483980152/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"felixchanyy"},"content":"* Role: Code Quality, IntelliJ expert","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Looks after code quality and code review, ensures adherence to coding standards, ","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"felixchanyy"},"content":"helps other team members with matters related to IntelliJ","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"felixchanyy"},"content":"### Zeng Zihui","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/zengzihui.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/zengzihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/zeng-zihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"felixchanyy"},"content":"* Role: Documentation, In charge of UI","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for the quality of various project documents,","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"felixchanyy"},"content":"review changes done to UI, act as the gate keeper of its quality, help others when they face","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"felixchanyy"},"content":"difficulties while modifying UI","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"felixchanyy"},"content":"### Liu Zhengyang","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/redcolorbicycle.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/redcolorbicycle)]","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/liu-zhengyang)]","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"felixchanyy"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":67,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":36,"-":31}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"zengzihui"},"content":"# EstateEase Developer Guide","lastModifiedDate":"2024-03-04"},{"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":"zengzihui"},"content":"* Residential Property Real Estate Listing Agent in Singapore","lastModifiedDate":"2024-03-04"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"zengzihui"},"content":"**Value proposition**: EstateEase simplifies residential property management for real estate listing agents in Singapore. With intuitive tools for listing and client communication, the app is tailored for efficiency. Agents can quickly access contacts and prioritize them, ensuring swift connections with clients.","lastModifiedDate":"2024-03-04"},{"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":"zengzihui"},"content":"|----------|-------------------|--------------------------------------------------------------|------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | add home-owners | keep track of their contact details and the properties that they are selling |","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | view a list of all contacts stored, along with their details | quickly find the contact I need |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | delete contacts | remove outdated or irrelevant contacts |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | be able to import my existing contact and address data | seamlessly transition to using EstateEase |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | save any changes or updates made to the contact details | ensure that my data is always up-to-date |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"zengzihui"},"content":"(For all use cases below, the **System** is the `EstateEase` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC01 - Add home-owners to user’s contact list**","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"KhoonSun47"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"KhoonSun47"},"content":"1. User chooses to add home-owner.","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"KhoonSun47"},"content":"2. EstateEase requests for the details of the home-owner.","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"KhoonSun47"},"content":"3. User enters the requested details.","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"KhoonSun47"},"content":"4. EstateEase adds the home-owner and displays the newly added home-owner. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3i:** EstateEase has received the details of the home-owner from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the block number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3k and 3l:** EstateEase has received the details of the home-owner from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the unit number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"KhoonSun47"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"KhoonSun47"},"content":"* 3a. EstateEase detects missing name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"KhoonSun47"},"content":" * 3a1. EstateEase shows an error message regarding missing name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"KhoonSun47"},"content":"* 3b. EstateEase detects duplicate name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"KhoonSun47"},"content":" * 3b1. EstateEase shows an error message regarding duplicate name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"KhoonSun47"},"content":"* 3c. EstateEase detects missing phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"KhoonSun47"},"content":" * 3c1. EstateEase shows an error message regarding missing phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"KhoonSun47"},"content":"* 3d. EstateEase detects incorrect format for phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"KhoonSun47"},"content":" * 3d1. EstateEase shows an error message regarding incorrect format for phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"KhoonSun47"},"content":"* 3e. EstateEase detects missing email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"KhoonSun47"},"content":" * 3e1. EstateEase shows an error message regarding missing email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"KhoonSun47"},"content":"* 3f. EstateEase detects incorrect format for email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"KhoonSun47"},"content":" * 3f1. EstateEase shows an error message regarding incorrect format for email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"KhoonSun47"},"content":"* 3g. EstateEase detects missing housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"KhoonSun47"},"content":" * 3g1. EstateEase shows an error message regarding missing housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"KhoonSun47"},"content":"* 3h. EstateEase detects incorrect housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"KhoonSun47"},"content":" * 3h1. EstateEase shows an error message regarding the entry of incorrect of housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"KhoonSun47"},"content":"* 3i. EstateEase detects missing block number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"KhoonSun47"},"content":" * \t3i1. EstateEase shows an error message regarding missing block number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"KhoonSun47"},"content":"* 3j. EstateEase detects missing street name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"KhoonSun47"},"content":" * 3j1. EstateEase shows an error message regarding missing street name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"KhoonSun47"},"content":"* 3k. EstateEase detects missing unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"KhoonSun47"},"content":" * 3k1. EstateEase shows an error message regarding missing unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"KhoonSun47"},"content":"* 3l. EstateEase detects incorrect format for unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"KhoonSun47"},"content":" * 3l1. EstateEase shows an error message regarding incorrect format for unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"KhoonSun47"},"content":"* 3m. EstateEase detects missing postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"KhoonSun47"},"content":" * 3m1. EstateEase shows an error message regarding missing postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"KhoonSun47"},"content":"* 3n. EstateEase detects incorrect format for postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"KhoonSun47"},"content":" * 3n1. EstateEase shows an error message regarding incorrect format for postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"KhoonSun47"},"content":"* 3o. EstateEase detects missing role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"KhoonSun47"},"content":" * 3o1. EstateEase shows an error message regarding missing role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"KhoonSun47"},"content":"* 3p. EstateEase detects incorrect role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"KhoonSun47"},"content":" * 3p1. EstateEase shows an error message regarding the entry of incorrect role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"KhoonSun47"},"content":"* 3q. EstateEase detects incorrect priority level in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"KhoonSun47"},"content":" * 3q1. EstateEase shows an error message regarding the entry of incorrect priority level. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"redcolorbicycle"},"content":"**Use case: UC02 - View all**","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"redcolorbicycle"},"content":"**MSS:**","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"redcolorbicycle"},"content":"1. User requests to list persons ","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"redcolorbicycle"},"content":"2. EstateEase shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"redcolorbicycle"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"redcolorbicycle"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"redcolorbicycle"},"content":"*2a. The list is empty","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"redcolorbicycle"},"content":" * 2a1. EstateEast displays a message stating that the list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"redcolorbicycle"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"lokidoki102"},"content":"**Use case: UC03 - Delete a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"zengzihui"},"content":"2. EstateEase shows a list of persons","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"zengzihui"},"content":"4. EstateEase deletes the person","lastModifiedDate":"2024-03-04"},{"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":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"zengzihui"},"content":" * 3a1. EstateEase shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"felixchanyy"},"content":"**Use case: UC04 - Load contact data from file**","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"felixchanyy"},"content":"**Actor: EstateEase**","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"felixchanyy"},"content":"**Preconditions:**","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"felixchanyy"},"content":"- EstateEase is initialized.","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"felixchanyy"},"content":"- The user starts the application.","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"felixchanyy"},"content":"**MSS:**","lastModifiedDate":"2024-03-06"},{"lineNumber":436,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"felixchanyy"},"content":"1. EstateEase automatically loads existing contact and address data from a JSON file stored in the \"data\" folder at the same directory level as the application.","lastModifiedDate":"2024-03-06"},{"lineNumber":438,"author":{"gitId":"felixchanyy"},"content":"2. EstateEase parses the JSON file and imports the contact and address data into the application\u0027s memory.","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"felixchanyy"},"content":"3. EstateEase displays the imported contact and address data to the user.","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":442,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":443,"author":{"gitId":"felixchanyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"felixchanyy"},"content":"* 1a. EstateEase detects that the JSON file in the \"data\" folder is missing or inaccessible.","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"felixchanyy"},"content":" * 1a1. EstateEase attempts to create an empty JSON file named \"addressbook.json\" in the \"data\" folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"felixchanyy"},"content":" * 1a2. If EstateEase fails to create the JSON file:","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"felixchanyy"},"content":" * 1a2a. EstateEase displays an error message indicating that the contact and address data could not be loaded, and the \"data\" folder could not be accessed.","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":450,"author":{"gitId":"felixchanyy"},"content":" * 1a3. If EstateEase successfully creates the JSON file:","lastModifiedDate":"2024-03-06"},{"lineNumber":451,"author":{"gitId":"felixchanyy"},"content":" * 1a3a. EstateEase proceeds to load contact and address data from the newly created JSON file.","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"author":{"gitId":"felixchanyy"},"content":" Use case continues from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"felixchanyy"},"content":"* 1b. EstateEase detects that the JSON file in the \"data\" folder is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":455,"author":{"gitId":"felixchanyy"},"content":" * 1b1. EstateEase displays a message indicating that there are no contacts with address data to load.","lastModifiedDate":"2024-03-06"},{"lineNumber":456,"author":{"gitId":"felixchanyy"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":457,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":458,"author":{"gitId":"felixchanyy"},"content":"* 1c. EstateEase detects that the JSON file in the \"data\" folder has incorrect format.","lastModifiedDate":"2024-03-06"},{"lineNumber":459,"author":{"gitId":"felixchanyy"},"content":" * 1c1. EstateEase displays an error message indicating that the contact and address data could not be loaded due to incorrect file format.","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":461,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":462,"author":{"gitId":"felixchanyy"},"content":"* 1d. EstateEase detects that the \"data\" folder does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":463,"author":{"gitId":"felixchanyy"},"content":" * 1d1. EstateEase attempts to create the \"data\" folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":464,"author":{"gitId":"felixchanyy"},"content":" * 1d2. If EstateEase fails to create the \"data\" folder:","lastModifiedDate":"2024-03-06"},{"lineNumber":465,"author":{"gitId":"felixchanyy"},"content":" * 1d2a. EstateEase displays an error message indicating that the \"data\" folder could not be created.","lastModifiedDate":"2024-03-06"},{"lineNumber":466,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":467,"author":{"gitId":"felixchanyy"},"content":" * 1d3. If EstateEase successfully creates the \"data\" folder:","lastModifiedDate":"2024-03-06"},{"lineNumber":468,"author":{"gitId":"felixchanyy"},"content":" * 1d3a. EstateEase proceeds to create an empty JSON file named \"addressbook.json\" in the \"data\" folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":469,"author":{"gitId":"felixchanyy"},"content":" * 1d3b. EstateEase proceeds to load contact and address data from the newly created JSON file.","lastModifiedDate":"2024-03-06"},{"lineNumber":470,"author":{"gitId":"felixchanyy"},"content":" Use case continues from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":471,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":472,"author":{"gitId":"lokidoki102"},"content":"**Use case: UC05 - Save to storage**","lastModifiedDate":"2024-03-04"},{"lineNumber":473,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":474,"author":{"gitId":"lokidoki102"},"content":"**Actor: EstateEase**","lastModifiedDate":"2024-03-04"},{"lineNumber":475,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":476,"author":{"gitId":"lokidoki102"},"content":"**Preconditions: The user initiates an add or delete command**","lastModifiedDate":"2024-03-04"},{"lineNumber":477,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":478,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":479,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":480,"author":{"gitId":"lokidoki102"},"content":"1. EstateEase processes the add (UC01) or delete (UC03) command and updates the address book accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":481,"author":{"gitId":"lokidoki102"},"content":"2. EstateEase attempts to update the JSON file accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":482,"author":{"gitId":"lokidoki102"},"content":"3. EstateEase successfully updates the JSON file.","lastModifiedDate":"2024-03-04"},{"lineNumber":483,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":484,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":485,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":486,"author":{"gitId":"lokidoki102"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":487,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":488,"author":{"gitId":"lokidoki102"},"content":"* 2a. EstateEase is unable to write to the JSON file due to file permission issue.","lastModifiedDate":"2024-03-04"},{"lineNumber":489,"author":{"gitId":"lokidoki102"},"content":" * 2a1. EstateEase shows error message regarding the insufficient file permission to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":490,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":491,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":492,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":493,"author":{"gitId":"lokidoki102"},"content":"* 2b. EstateEase is unable to write to the JSON file due to some IOException.","lastModifiedDate":"2024-03-04"},{"lineNumber":494,"author":{"gitId":"lokidoki102"},"content":" * 2b1. EstateEase shows error message regarding the IOException to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":495,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":496,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":497,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":498,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"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":503,"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":504,"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":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":511,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":521,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":522,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"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":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"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":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"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":551,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"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":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"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":556,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"felixchanyy"},"content":"### Loading and Saving Data","lastModifiedDate":"2024-03-06"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"felixchanyy"},"content":"1. **Dealing with Missing/Created Data Folder**","lastModifiedDate":"2024-03-06"},{"lineNumber":563,"author":{"gitId":"felixchanyy"},"content":" - **Loading Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":564,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing data folder during loading, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":565,"author":{"gitId":"felixchanyy"},"content":" - **Saving Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":566,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing data folder during saving, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"felixchanyy"},"content":"2. **Dealing with Missing/Corrupted Data Files**","lastModifiedDate":"2024-03-06"},{"lineNumber":569,"author":{"gitId":"felixchanyy"},"content":" - **Loading Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":570,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing or corrupted data file during loading, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":571,"author":{"gitId":"felixchanyy"},"content":" - **Saving Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":572,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing or corrupted data file during saving, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":573,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":574,"author":{"gitId":"felixchanyy"},"content":"3. _{ more test cases …​ }_","lastModifiedDate":"2024-03-06"},{"lineNumber":575,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"redcolorbicycle":16,"zengzihui":13,"KhoonSun47":84,"felixchanyy":58,"-":376,"lokidoki102":28}},{"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":"felixchanyy"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eEstateEase\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":{"felixchanyy":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"felixchanyy"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F09-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp/graph/badge.svg?token\u003dNB86I9H23Z)](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp)","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"## About the app","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"felixchanyy"},"content":"EstateEase simplifies residential property management for real estate listing agents in Singapore.","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"felixchanyy"},"content":"### Key Features:","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"felixchanyy"},"content":" * With intuitive tools for listing and client communication, the app is tailored for efficiency. ","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"felixchanyy"},"content":" * Agents can quickly access contacts and prioritize them, ensuring swift connections with clients. ","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"felixchanyy"},"content":"### Example Usages:","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to add and delete client information.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to prioritize client contacts for efficient communication","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to load and save the list using JSON file","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"This project is based on the AddressBook-Level3 project created by the ","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":17,"-":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":"felixchanyy"},"content":"You can reach us at the email `felixchanyy.22@u.nus.edu`","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"### Felix Chan","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/felixchanyy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"[[homepage](https://nus-cs2103-ay2324s2.github.io/website)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"[[github](https://github.com/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"felixchanyy"},"content":"* Role: Team Lead, Scheduling and Tracking, Git Expert","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for overall project coordination, in charge of defining, assigning, and tracking ","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"felixchanyy"},"content":"project tasks, helps other team members with matters related to Git","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"felixchanyy"},"content":"### Yek Khoon Sun","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/khoonsun47.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/khoonsun47)]","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://sg.linkedin.com/in/yek-khoon-sun-2b2270177)]","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"felixchanyy"},"content":"* Role: Testing","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensures the testing of the project is done properly and on time","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"felixchanyy"},"content":"### Carl Lim","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/lokidoki102.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/lokidoki102)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/carl-lim-483980152/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"felixchanyy"},"content":"* Role: Code Quality, IntelliJ expert","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Looks after code quality and code review, ensures adherence to coding standards, ","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"felixchanyy"},"content":"helps other team members with matters related to IntelliJ","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"felixchanyy"},"content":"### Zeng Zihui","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/zengzihui.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/zengzihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/zeng-zihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"felixchanyy"},"content":"* Role: Documentation, In charge of UI","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for the quality of various project documents,","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"felixchanyy"},"content":"review changes done to UI, act as the gate keeper of its quality, help others when they face","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"felixchanyy"},"content":"difficulties while modifying UI","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"felixchanyy"},"content":"### Liu Zhengyang","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/redcolorbicycle.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/redcolorbicycle)]","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/liu-zhengyang)]","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"felixchanyy"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":67,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":36,"-":31}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"zengzihui"},"content":"# EstateEase Developer Guide","lastModifiedDate":"2024-03-04"},{"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":"zengzihui"},"content":"* Residential Property Real Estate Listing Agent in Singapore","lastModifiedDate":"2024-03-04"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"zengzihui"},"content":"**Value proposition**: EstateEase simplifies residential property management for real estate listing agents in Singapore. With intuitive tools for listing and client communication, the app is tailored for efficiency. Agents can quickly access contacts and prioritize them, ensuring swift connections with clients.","lastModifiedDate":"2024-03-04"},{"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":"zengzihui"},"content":"|----------|-------------------|--------------------------------------------------------------|------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | add home-owners | keep track of their contact details and the properties that they are selling |","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | view a list of all contacts stored, along with their details | quickly find the contact I need |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | delete contacts | remove outdated or irrelevant contacts |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | be able to import my existing contact and address data | seamlessly transition to using EstateEase |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | save any changes or updates made to the contact details | ensure that my data is always up-to-date |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"zengzihui"},"content":"(For all use cases below, the **System** is the `EstateEase` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC01 - Add home-seller to user’s contact list**","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"KhoonSun47"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"KhoonSun47"},"content":"1. User chooses to add home-seller.","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"KhoonSun47"},"content":"2. EstateEase requests for the details of the home-seller.","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"KhoonSun47"},"content":"3. User enters the requested details.","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"KhoonSun47"},"content":"4. EstateEase adds the home-seller and displays the newly added home-seller. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3i:** EstateEase has received the details of the home-seller from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the block number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3k and 3l:** EstateEase has received the details of the home-seller from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the unit number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3i, 3j, 3k, 3l, 3m, 3n:** EstateEase has received the details of the home-seller from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects missing block number, street name, unit number and postal code in the entered data when he is a home-seller.","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"KhoonSun47"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"KhoonSun47"},"content":"* 3a. EstateEase detects missing name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"KhoonSun47"},"content":" * 3a1. EstateEase shows an error message regarding missing name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"KhoonSun47"},"content":"* 3b. EstateEase detects duplicate name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"KhoonSun47"},"content":" * 3b1. EstateEase shows an error message regarding duplicate name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"KhoonSun47"},"content":"* 3c. EstateEase detects missing phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"KhoonSun47"},"content":" * 3c1. EstateEase shows an error message regarding missing phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"KhoonSun47"},"content":"* 3d. EstateEase detects incorrect format for phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"KhoonSun47"},"content":" * 3d1. EstateEase shows an error message regarding incorrect format for phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"KhoonSun47"},"content":"* 3e. EstateEase detects missing email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"KhoonSun47"},"content":" * 3e1. EstateEase shows an error message regarding missing email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"KhoonSun47"},"content":"* 3f. EstateEase detects incorrect format for email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"KhoonSun47"},"content":" * 3f1. EstateEase shows an error message regarding incorrect format for email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"KhoonSun47"},"content":"* 3g. EstateEase detects missing housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"KhoonSun47"},"content":" * 3g1. EstateEase shows an error message regarding missing housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"KhoonSun47"},"content":"* 3h. EstateEase detects incorrect housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"KhoonSun47"},"content":" * 3h1. EstateEase shows an error message regarding the entry of incorrect of housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"KhoonSun47"},"content":"* 3i. EstateEase detects missing block number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"KhoonSun47"},"content":" * 3i1. EstateEase shows an error message regarding missing block number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"KhoonSun47"},"content":"* 3j. EstateEase detects missing street name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"KhoonSun47"},"content":" * 3j1. EstateEase shows an error message regarding missing street name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"KhoonSun47"},"content":"* 3k. EstateEase detects missing unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"KhoonSun47"},"content":" * 3k1. EstateEase shows an error message regarding missing unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"KhoonSun47"},"content":"* 3l. EstateEase detects incorrect format for unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"KhoonSun47"},"content":" * 3l1. EstateEase shows an error message regarding incorrect format for unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"KhoonSun47"},"content":"* 3m. EstateEase detects missing postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"KhoonSun47"},"content":" * 3m1. EstateEase shows an error message regarding missing postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"KhoonSun47"},"content":"* 3n. EstateEase detects incorrect format for postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"KhoonSun47"},"content":" * 3n1. EstateEase shows an error message regarding incorrect format for postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"KhoonSun47"},"content":"* 3o. EstateEase detects missing role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"KhoonSun47"},"content":" * 3o1. EstateEase shows an error message regarding missing role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"KhoonSun47"},"content":"* 3p. EstateEase detects incorrect role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"KhoonSun47"},"content":" * 3p1. EstateEase shows an error message regarding the entry of incorrect role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"KhoonSun47"},"content":"* 3q. EstateEase detects incorrect priority level in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"KhoonSun47"},"content":" * 3q1. EstateEase shows an error message regarding the entry of incorrect priority level. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC02 - Add home-buyer to user’s contact list**","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"KhoonSun47"},"content":"**MSS:**","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"KhoonSun47"},"content":"1. User chooses to add home-buyer.","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"KhoonSun47"},"content":"2. EstateEase requests for the details of the home-buyer.","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"KhoonSun47"},"content":"3. User enters the requested details.","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"KhoonSun47"},"content":"4. EstateEase adds the home-buyer and displays the newly added home-buyer. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3i:** EstateEase has received the details of the home-buyer from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects block number, street name, unit number and postal code in the entered data when he is a home-buyer.","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"KhoonSun47"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"KhoonSun47"},"content":"* 3a. EstateEase detects missing name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"KhoonSun47"},"content":" * 3a1. EstateEase shows an error message regarding missing name. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"KhoonSun47"},"content":"* 3b. EstateEase detects duplicate name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"KhoonSun47"},"content":" * 3b1. EstateEase shows an error message regarding duplicate name. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"KhoonSun47"},"content":"* 3c. EstateEase detects missing phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"KhoonSun47"},"content":" * 3c1. EstateEase shows an error message regarding missing phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"KhoonSun47"},"content":"* 3d. EstateEase detects incorrect format for phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"KhoonSun47"},"content":" * 3d1. EstateEase shows an error message regarding incorrect format for phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"KhoonSun47"},"content":"* 3e. EstateEase detects missing email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"KhoonSun47"},"content":" * 3e1. EstateEase shows an error message regarding missing email. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"KhoonSun47"},"content":"* 3f. EstateEase detects incorrect format for email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"KhoonSun47"},"content":" * 3f1. EstateEase shows an error message regarding incorrect format for email. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"KhoonSun47"},"content":"* 3g. EstateEase detects missing housing type (requirement for filter) in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"KhoonSun47"},"content":" * 3g1. EstateEase shows an error message regarding missing housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"KhoonSun47"},"content":"* 3h. EstateEase detects incorrect housing type (requirement for filter) in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"KhoonSun47"},"content":" * 3h1. EstateEase shows an error message regarding the entry of incorrect of housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":436,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":438,"author":{"gitId":"KhoonSun47"},"content":"* 3i. EstateEase detects block number, street name, unit number and postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"KhoonSun47"},"content":" * 3i1. EstateEase shows an error message regarding the entry of housing details because home-buyer should not have a home yet. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":442,"author":{"gitId":"KhoonSun47"},"content":"* 3j. EstateEase detects missing role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":443,"author":{"gitId":"KhoonSun47"},"content":" * 3j1. EstateEase shows an error message regarding missing role. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"KhoonSun47"},"content":"* 3k. EstateEase detects incorrect role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"KhoonSun47"},"content":" * 3k1. EstateEase shows an error message regarding the entry of incorrect role. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":450,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC03 - Add more homes to home-seller**","lastModifiedDate":"2024-03-06"},{"lineNumber":451,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"author":{"gitId":"KhoonSun47"},"content":"**MSS:**","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"KhoonSun47"},"content":"1. User chooses to add new home to home-seller.","lastModifiedDate":"2024-03-06"},{"lineNumber":455,"author":{"gitId":"KhoonSun47"},"content":"2. EstateEase requests for the details of the home.","lastModifiedDate":"2024-03-06"},{"lineNumber":456,"author":{"gitId":"KhoonSun47"},"content":"3. User enters requested details.","lastModifiedDate":"2024-03-06"},{"lineNumber":457,"author":{"gitId":"KhoonSun47"},"content":"4. EstateEase adds the new home and displays the newly added home of the home-seller. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":458,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":459,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3i:** EstateEase has received the details of the home from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":461,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the block number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-06"},{"lineNumber":462,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":463,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3k and 3l:** EstateEase has received the details of the home from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":464,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the unit number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-06"},{"lineNumber":465,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":466,"author":{"gitId":"KhoonSun47"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":467,"author":{"gitId":"KhoonSun47"},"content":"* 1a. The contact list does not have any home-seller. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":468,"author":{"gitId":"KhoonSun47"},"content":" * 1a1. EstateEase shows an error message stating that the contact list does not have home-seller. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":469,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":471,"author":{"gitId":"KhoonSun47"},"content":"* 3a. EstateEase detects missing name of the home-seller in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":472,"author":{"gitId":"KhoonSun47"},"content":" * 3a1. EstateEase shows an error message regarding missing name. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":473,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":475,"author":{"gitId":"KhoonSun47"},"content":"* 3b. EstateEase detects invalid name of the home-seller in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":476,"author":{"gitId":"KhoonSun47"},"content":" * 3b1. EstateEase shows an error message regarding invalid name. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":477,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":478,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":479,"author":{"gitId":"KhoonSun47"},"content":"* 3c. EstateEase detects that the name does not belong to home-seller, but to home-buyer instead. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":480,"author":{"gitId":"KhoonSun47"},"content":" * 3c1. EstateEase shows an error message regarding home can only be attached to home-seller, instead of home-buyer. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":481,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"KhoonSun47"},"content":"* 3d. EstateEase detects missing housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":484,"author":{"gitId":"KhoonSun47"},"content":" * 3d1. EstateEase shows an error message regarding missing housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":485,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":486,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":487,"author":{"gitId":"KhoonSun47"},"content":"* 3e. EstateEase detects incorrect housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":488,"author":{"gitId":"KhoonSun47"},"content":" * 3e1. EstateEase shows an error message regarding the entry of incorrect of housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":489,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":490,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":491,"author":{"gitId":"KhoonSun47"},"content":"* 3f. EstateEase detects missing block number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":492,"author":{"gitId":"KhoonSun47"},"content":" * 3f1. EstateEase shows an error message regarding missing block number. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":493,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"KhoonSun47"},"content":"* 3g. EstateEase detects missing street name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"KhoonSun47"},"content":" * 3g1. EstateEase shows an error message regarding missing street name. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"KhoonSun47"},"content":"* 3h. EstateEase detects missing unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"KhoonSun47"},"content":" * 3h1. EstateEase shows an error message regarding missing unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"KhoonSun47"},"content":"* 3i. EstateEase detects incorrect format for unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"KhoonSun47"},"content":" * 3i1. EstateEase shows an error message regarding incorrect format for unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":505,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":506,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":507,"author":{"gitId":"KhoonSun47"},"content":"* 3j. EstateEase detects missing postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":508,"author":{"gitId":"KhoonSun47"},"content":" * 3j1. EstateEase shows an error message regarding missing postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":509,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"KhoonSun47"},"content":"* 3k. EstateEase detects incorrect format for postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"KhoonSun47"},"content":" * 3k1. EstateEase shows an error message regarding incorrect format for postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC04 - Viewing of homes based on home-seller\u0027s priority**","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"KhoonSun47"},"content":"**Preconditions:**","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"KhoonSun47"},"content":"- The user initialises a view command with home-seller as a filter","lastModifiedDate":"2024-03-06"},{"lineNumber":519,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":520,"author":{"gitId":"KhoonSun47"},"content":"**MSS:**","lastModifiedDate":"2024-03-06"},{"lineNumber":521,"author":{"gitId":"KhoonSun47"},"content":"1. EstateEase process the view command with home-seller as filter.","lastModifiedDate":"2024-03-06"},{"lineNumber":522,"author":{"gitId":"KhoonSun47"},"content":"2. EstateEase shows a list of home-sellers, arranged based on their priority. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":523,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":524,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":525,"author":{"gitId":"KhoonSun47"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":526,"author":{"gitId":"KhoonSun47"},"content":"* 1a. The contact list does not have any home-seller. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":527,"author":{"gitId":"KhoonSun47"},"content":" * 1a1. EstateEase shows an error message stating that the contact list does not have home-seller. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":528,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":529,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":530,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC05 - View all**","lastModifiedDate":"2024-03-06"},{"lineNumber":531,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":532,"author":{"gitId":"redcolorbicycle"},"content":"**MSS:**","lastModifiedDate":"2024-03-05"},{"lineNumber":533,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":534,"author":{"gitId":"redcolorbicycle"},"content":"1. User requests to list persons ","lastModifiedDate":"2024-03-05"},{"lineNumber":535,"author":{"gitId":"redcolorbicycle"},"content":"2. EstateEase shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":536,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":537,"author":{"gitId":"redcolorbicycle"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":538,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":539,"author":{"gitId":"redcolorbicycle"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":540,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":541,"author":{"gitId":"redcolorbicycle"},"content":"*2a. The list is empty","lastModifiedDate":"2024-03-05"},{"lineNumber":542,"author":{"gitId":"redcolorbicycle"},"content":" * 2a1. EstateEast displays a message stating that the list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":543,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":544,"author":{"gitId":"redcolorbicycle"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":545,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":546,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC06 - Delete a person**","lastModifiedDate":"2024-03-06"},{"lineNumber":547,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":549,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"zengzihui"},"content":"2. EstateEase shows a list of persons","lastModifiedDate":"2024-03-04"},{"lineNumber":552,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"zengzihui"},"content":"4. EstateEase deletes the person","lastModifiedDate":"2024-03-04"},{"lineNumber":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"zengzihui"},"content":" * 3a1. EstateEase shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":566,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC07 - Load contact data from file**","lastModifiedDate":"2024-03-06"},{"lineNumber":570,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":571,"author":{"gitId":"felixchanyy"},"content":"**Actor: EstateEase**","lastModifiedDate":"2024-03-06"},{"lineNumber":572,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":573,"author":{"gitId":"felixchanyy"},"content":"**Preconditions:**","lastModifiedDate":"2024-03-06"},{"lineNumber":574,"author":{"gitId":"felixchanyy"},"content":"- EstateEase is initialized.","lastModifiedDate":"2024-03-06"},{"lineNumber":575,"author":{"gitId":"felixchanyy"},"content":"- The user starts the application.","lastModifiedDate":"2024-03-06"},{"lineNumber":576,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":577,"author":{"gitId":"felixchanyy"},"content":"**MSS:**","lastModifiedDate":"2024-03-06"},{"lineNumber":578,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":579,"author":{"gitId":"felixchanyy"},"content":"1. EstateEase automatically loads existing contact and address data from a JSON file stored in the \"data\" folder at the same directory level as the application.","lastModifiedDate":"2024-03-06"},{"lineNumber":580,"author":{"gitId":"felixchanyy"},"content":"2. EstateEase parses the JSON file and imports the contact and address data into the application\u0027s memory.","lastModifiedDate":"2024-03-06"},{"lineNumber":581,"author":{"gitId":"felixchanyy"},"content":"3. EstateEase displays the imported contact and address data to the user.","lastModifiedDate":"2024-03-06"},{"lineNumber":582,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":583,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":584,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":585,"author":{"gitId":"felixchanyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":586,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":587,"author":{"gitId":"felixchanyy"},"content":"* 1a. EstateEase detects that the JSON file in the \"data\" folder is missing or inaccessible.","lastModifiedDate":"2024-03-06"},{"lineNumber":588,"author":{"gitId":"felixchanyy"},"content":" * 1a1. EstateEase attempts to create an empty JSON file named \"addressbook.json\" in the \"data\" folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":589,"author":{"gitId":"felixchanyy"},"content":" * 1a2. If EstateEase fails to create the JSON file:","lastModifiedDate":"2024-03-06"},{"lineNumber":590,"author":{"gitId":"felixchanyy"},"content":" * 1a2a. EstateEase displays an error message indicating that the contact and address data could not be loaded, and the \"data\" folder could not be accessed.","lastModifiedDate":"2024-03-06"},{"lineNumber":591,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":592,"author":{"gitId":"felixchanyy"},"content":" * 1a3. If EstateEase successfully creates the JSON file:","lastModifiedDate":"2024-03-06"},{"lineNumber":593,"author":{"gitId":"felixchanyy"},"content":" * 1a3a. EstateEase proceeds to load contact and address data from the newly created JSON file.","lastModifiedDate":"2024-03-06"},{"lineNumber":594,"author":{"gitId":"felixchanyy"},"content":" Use case continues from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":595,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":596,"author":{"gitId":"felixchanyy"},"content":"* 1b. EstateEase detects that the JSON file in the \"data\" folder is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":597,"author":{"gitId":"felixchanyy"},"content":" * 1b1. EstateEase displays a message indicating that there are no contacts with address data to load.","lastModifiedDate":"2024-03-06"},{"lineNumber":598,"author":{"gitId":"felixchanyy"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":599,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":600,"author":{"gitId":"felixchanyy"},"content":"* 1c. EstateEase detects that the JSON file in the \"data\" folder has incorrect format.","lastModifiedDate":"2024-03-06"},{"lineNumber":601,"author":{"gitId":"felixchanyy"},"content":" * 1c1. EstateEase displays an error message indicating that the contact and address data could not be loaded due to incorrect file format.","lastModifiedDate":"2024-03-06"},{"lineNumber":602,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":603,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":604,"author":{"gitId":"felixchanyy"},"content":"* 1d. EstateEase detects that the \"data\" folder does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":605,"author":{"gitId":"felixchanyy"},"content":" * 1d1. EstateEase attempts to create the \"data\" folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":606,"author":{"gitId":"felixchanyy"},"content":" * 1d2. If EstateEase fails to create the \"data\" folder:","lastModifiedDate":"2024-03-06"},{"lineNumber":607,"author":{"gitId":"felixchanyy"},"content":" * 1d2a. EstateEase displays an error message indicating that the \"data\" folder could not be created.","lastModifiedDate":"2024-03-06"},{"lineNumber":608,"author":{"gitId":"felixchanyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":609,"author":{"gitId":"felixchanyy"},"content":" * 1d3. If EstateEase successfully creates the \"data\" folder:","lastModifiedDate":"2024-03-06"},{"lineNumber":610,"author":{"gitId":"felixchanyy"},"content":" * 1d3a. EstateEase proceeds to create an empty JSON file named \"addressbook.json\" in the \"data\" folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":611,"author":{"gitId":"felixchanyy"},"content":" * 1d3b. EstateEase proceeds to load contact and address data from the newly created JSON file.","lastModifiedDate":"2024-03-06"},{"lineNumber":612,"author":{"gitId":"felixchanyy"},"content":" Use case continues from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":613,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":614,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC08 - Save to storage**","lastModifiedDate":"2024-03-06"},{"lineNumber":615,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":616,"author":{"gitId":"lokidoki102"},"content":"**Actor: EstateEase**","lastModifiedDate":"2024-03-04"},{"lineNumber":617,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":618,"author":{"gitId":"lokidoki102"},"content":"**Preconditions: The user initiates an add or delete command**","lastModifiedDate":"2024-03-04"},{"lineNumber":619,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":620,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":621,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":622,"author":{"gitId":"lokidoki102"},"content":"1. EstateEase processes the add (UC01) or delete (UC03) command and updates the address book accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":623,"author":{"gitId":"lokidoki102"},"content":"2. EstateEase attempts to update the JSON file accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":624,"author":{"gitId":"lokidoki102"},"content":"3. EstateEase successfully updates the JSON file.","lastModifiedDate":"2024-03-04"},{"lineNumber":625,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":626,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":627,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":628,"author":{"gitId":"lokidoki102"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":629,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":630,"author":{"gitId":"lokidoki102"},"content":"* 2a. EstateEase is unable to write to the JSON file due to file permission issue.","lastModifiedDate":"2024-03-04"},{"lineNumber":631,"author":{"gitId":"lokidoki102"},"content":" * 2a1. EstateEase shows error message regarding the insufficient file permission to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":632,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":633,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":634,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":635,"author":{"gitId":"lokidoki102"},"content":"* 2b. EstateEase is unable to write to the JSON file due to some IOException.","lastModifiedDate":"2024-03-04"},{"lineNumber":636,"author":{"gitId":"lokidoki102"},"content":" * 2b1. EstateEase shows error message regarding the IOException to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":637,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":638,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":639,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":640,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":643,"author":{"gitId":"KhoonSun47"},"content":"1. The program should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-06"},{"lineNumber":644,"author":{"gitId":"KhoonSun47"},"content":"2. The program should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":645,"author":{"gitId":"KhoonSun47"},"content":"3. The program should be capable of running both online and offline.","lastModifiedDate":"2024-03-06"},{"lineNumber":646,"author":{"gitId":"KhoonSun47"},"content":"4. The program should be able to recover from common errors and not crash without user intervention.","lastModifiedDate":"2024-03-06"},{"lineNumber":647,"author":{"gitId":"KhoonSun47"},"content":"5. The program should provide meaningful error messages that guide the user to resolve issues.","lastModifiedDate":"2024-03-06"},{"lineNumber":648,"author":{"gitId":"KhoonSun47"},"content":"6. The program should be able to respond to any user input within at most 2 seconds.","lastModifiedDate":"2024-03-06"},{"lineNumber":649,"author":{"gitId":"KhoonSun47"},"content":"7. The program must perform consistently across different devices and operating systems with a reliability rate of 99%.","lastModifiedDate":"2024-03-06"},{"lineNumber":650,"author":{"gitId":"KhoonSun47"},"content":"8. The program only supports one user at a time.","lastModifiedDate":"2024-03-06"},{"lineNumber":651,"author":{"gitId":"KhoonSun47"},"content":"9. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-06"},{"lineNumber":652,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":653,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":654,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":655,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":656,"author":{"gitId":"KhoonSun47"},"content":"* **CLI**: Command Line Interface","lastModifiedDate":"2024-03-06"},{"lineNumber":657,"author":{"gitId":"KhoonSun47"},"content":"* **GUI**: Graphical User Interface","lastModifiedDate":"2024-03-06"},{"lineNumber":658,"author":{"gitId":"KhoonSun47"},"content":"* **Index**: A number that references the position of the contact in the contact list","lastModifiedDate":"2024-03-06"},{"lineNumber":659,"author":{"gitId":"KhoonSun47"},"content":"* **Unique ID**: An attribute that uniquely identifies the contacts and houses in the contact list","lastModifiedDate":"2024-03-06"},{"lineNumber":660,"author":{"gitId":"KhoonSun47"},"content":"* **Home-buyer**: The contact who wants to buy a house","lastModifiedDate":"2024-03-06"},{"lineNumber":661,"author":{"gitId":"KhoonSun47"},"content":"* **Home-seller**: The contact who wants to sell their houses.","lastModifiedDate":"2024-03-06"},{"lineNumber":662,"author":{"gitId":"KhoonSun47"},"content":"* **Contact**: Home-buyer/Home-seller who is added to the list, containing details of name, phone number etc.","lastModifiedDate":"2024-03-06"},{"lineNumber":663,"author":{"gitId":"KhoonSun47"},"content":"* **Home**: Details of the homes by the home-seller","lastModifiedDate":"2024-03-06"},{"lineNumber":664,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":665,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":666,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":667,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":668,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":669,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":670,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":671,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":672,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":673,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":674,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":675,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":676,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":677,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":678,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":679,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":680,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":681,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":682,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":683,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":684,"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":685,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":686,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":687,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":688,"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":689,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":690,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":691,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":692,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":693,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":694,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":695,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":696,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":697,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":698,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":699,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":700,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":701,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":702,"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":703,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":704,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":705,"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":706,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":707,"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":708,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":709,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":710,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":711,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":712,"author":{"gitId":"felixchanyy"},"content":"### Loading and Saving Data","lastModifiedDate":"2024-03-06"},{"lineNumber":713,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":714,"author":{"gitId":"felixchanyy"},"content":"1. **Dealing with Missing/Created Data Folder**","lastModifiedDate":"2024-03-06"},{"lineNumber":715,"author":{"gitId":"felixchanyy"},"content":" - **Loading Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":716,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing data folder during loading, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":717,"author":{"gitId":"felixchanyy"},"content":" - **Saving Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":718,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing data folder during saving, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":719,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":720,"author":{"gitId":"felixchanyy"},"content":"2. **Dealing with Missing/Corrupted Data Files**","lastModifiedDate":"2024-03-06"},{"lineNumber":721,"author":{"gitId":"felixchanyy"},"content":" - **Loading Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":722,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing or corrupted data file during loading, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":723,"author":{"gitId":"felixchanyy"},"content":" - **Saving Data:**","lastModifiedDate":"2024-03-06"},{"lineNumber":724,"author":{"gitId":"felixchanyy"},"content":" - _{Explain how to simulate a missing or corrupted data file during saving, and the expected behavior}_","lastModifiedDate":"2024-03-06"},{"lineNumber":725,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":726,"author":{"gitId":"felixchanyy"},"content":"3. _{ more test cases …​ }_","lastModifiedDate":"2024-03-06"},{"lineNumber":727,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"redcolorbicycle":15,"zengzihui":13,"KhoonSun47":247,"felixchanyy":54,"-":372,"lokidoki102":26}},{"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":"felixchanyy"},"content":"# EstateEase User Guide","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"felixchanyy"},"content":"EstateEase 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, Estate Ease can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"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":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"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":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"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":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":{"felixchanyy":2,"-":202}},{"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":"felixchanyy"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eEstateEase\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":{"felixchanyy":1,"-":66}}] diff --git a/AY2324S2-CS2103-F09-1_tp_master/commits.json b/AY2324S2-CS2103-F09-1_tp_master/commits.json index c3c28d0b..b9b37503 100644 --- a/AY2324S2-CS2103-F09-1_tp_master/commits.json +++ b/AY2324S2-CS2103-F09-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"redcolorbicycle":[{"date":"2024-03-05","commitResults":[{"hash":"c27b71e1a13fe523788ea79dcb0fb357c40f89d3","isMergeCommit":true,"messageTitle":"Merge pull request #21 from KhoonSun47/branch-update-developer-guide","messageBody":"Branch update developer guide","fileTypesAndContributionMap":{}},{"hash":"cb692f1617a049621f50325f69bde3ff61660a98","isMergeCommit":false,"messageTitle":"Update use case UC02: View All","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":0}}}]}],"zengzihui":[{"date":"2024-03-04","commitResults":[{"hash":"3bf8fb3483bf513a06bf8c87688887d2dff23b38","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Update target user profile, value proposition, and user stories for v1.2.\nUpdate use case for delete contact.\n","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":17}}},{"hash":"3bbbb04b718ea7c7757dca95142ad3e92e3bb5e0","isMergeCommit":true,"messageTitle":"Merge pull request #17 from zengzihui/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide for target user profile, value proposition, and user stories for v1.2","fileTypesAndContributionMap":{}}]}],"KhoonSun47":[{"date":"2024-03-04","commitResults":[{"hash":"01368656f2edde1c9467693dfcc5131537fb69fd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103-F09-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"26ae6d0094063f4a27b0ef46714554a9e01bb351","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/KhoonSun47/tp","messageBody":"* \u0027master\u0027 of https://github.com/KhoonSun47/tp:\n Update EstateEase Developer Guide\n Update EstateEase Developer Guide\n Update README page\n Update AboutUs page\n Rename zhengyang.png. to zhengyang.png\n Rename zhengyang.png.jpg to zhengyang.png\n Added profile pic\n","fileTypesAndContributionMap":{}},{"hash":"6fad1deb95133281b72c04e334974643a7c904e8","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"DeveloperGuide.md: Add use case UC01 - Add home-owners to user\u0027s contact list\n","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":0}}}]}],"felixchanyy":[{"date":"2024-02-25","commitResults":[{"hash":"49ea064856c7f445023492f187e586955a8ff914","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1c557117b928997147adacbfbaa2a51e621be928","isMergeCommit":true,"messageTitle":"Merge pull request #1 from felixchanyy/switch-docs-to-markbind","messageBody":"Add branch Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"437dc448a25a27a4e80aadfba9c9ff559fff86df","isMergeCommit":false,"messageTitle":"Set up MarkBind website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3ec6fbcede9e2331e865e8c9013ed12ba595a14a","isMergeCommit":true,"messageTitle":"Merge pull request #2 from felixchanyy/master","messageBody":"Set up MarkBind website","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"a47aa2b24342c77b8db32c2a23911555036fb767","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add roles and individual profile pic\n","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":30}}},{"hash":"2d9d3d2668b299b07b49e579c65b1bf0555729f1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from felixchanyy/branch-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14246bf45fe143d902d1bf5bbebbd07da5eca49a","isMergeCommit":false,"messageTitle":"Update README page","messageBody":"Make changes to Ui mock up, update link of Github Actions badge\nand the content of the page.\n","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":11}}},{"hash":"d73491577039858c93774a124ef2be0533b6dbad","isMergeCommit":true,"messageTitle":"Merge pull request #16 from felixchanyy/branch-readme","messageBody":"Update README page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"1ad435b1386fa665892fa770ed9207d884c6f925","isMergeCommit":true,"messageTitle":"Merge pull request #23 from redcolorbicycle/master","messageBody":"Update use case UC02: View All","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"72493228177456b4fe4b3ecfee2cc3f0ec018f10","isMergeCommit":false,"messageTitle":"Add UC04 to the developer guide","messageBody":"The developer guide lacked information about loading contact data from\na JSON file (UC04). This addition provides detailed steps for\nloading contact data and handling various scenarios such as missing\nor empty JSON files, and non-existent data folders.\n\nThis change is made to ensure that developers have clear instructions\non how the application loads contact data, including the handling of\npotential errors or missing files.\n\nThis commit completes the coverage of contact data management\nin the developer guide, enhancing the documentation\u0027s comprehensiveness.\n","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":4}}},{"hash":"9868c642a892cd48db9bf604ce35a91533343030","isMergeCommit":true,"messageTitle":"Merge pull request #24 from felixchanyy/branch-update-developer-guide","messageBody":"Add UC04 (Load) to the developer guide","fileTypesAndContributionMap":{}}]}],"lokidoki102":[{"date":"2024-03-04","commitResults":[{"hash":"e619f001b6abc4609e4ad77c553f802c6e7d06aa","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Add use case (textual) for save to storage.\nUpdate delete contact use case to include use case number.\n","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":2}}},{"hash":"3d096c0e453bb7ffdd1a615edff7e8a7e1cab953","isMergeCommit":true,"messageTitle":"Merge pull request #19 from lokidoki102/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"redcolorbicycle":{"docs":16,"functional-code":0,"test-code":0},"zengzihui":{"docs":13,"functional-code":0,"test-code":0},"KhoonSun47":{"docs":84,"functional-code":0,"test-code":0},"felixchanyy":{"docs":112,"functional-code":0,"test-code":0},"lokidoki102":{"docs":28,"functional-code":0,"test-code":0}},"authorContributionVariance":{"redcolorbicycle":18.177515,"zengzihui":68.23669,"KhoonSun47":525.1597,"felixchanyy":825.13605,"lokidoki102":63.90533},"authorDisplayNameMap":{"redcolorbicycle":"CS2103-F09-1 LIU ..YANG","zengzihui":"CS2103-F09-1 ZENG..IHUI","KhoonSun47":"CS2103-F09-1 YEK .. SUN","felixchanyy":"CS2103-F09-1 FELI..YUAN","lokidoki102":"CS2103-F09-1 LIM ..RATO"}} +{"authorDailyContributionsMap":{"redcolorbicycle":[{"date":"2024-03-05","commitResults":[{"hash":"c27b71e1a13fe523788ea79dcb0fb357c40f89d3","isMergeCommit":true,"messageTitle":"Merge pull request #21 from KhoonSun47/branch-update-developer-guide","messageBody":"Branch update developer guide","fileTypesAndContributionMap":{}},{"hash":"cb692f1617a049621f50325f69bde3ff61660a98","isMergeCommit":false,"messageTitle":"Update use case UC02: View All","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":0}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ed349f1a8fb6783e84ca2bf64d584552e37b96f6","isMergeCommit":true,"messageTitle":"Merge pull request #32 from KhoonSun47/branch-update-developer-guide-2","messageBody":" Add 3 new uses cases (add home-buyer, add homes and view home-seller based on priority), update non-functional requirements and glossary","fileTypesAndContributionMap":{}}]}],"zengzihui":[{"date":"2024-03-04","commitResults":[{"hash":"3bf8fb3483bf513a06bf8c87688887d2dff23b38","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Update target user profile, value proposition, and user stories for v1.2.\nUpdate use case for delete contact.\n","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":17}}},{"hash":"3bbbb04b718ea7c7757dca95142ad3e92e3bb5e0","isMergeCommit":true,"messageTitle":"Merge pull request #17 from zengzihui/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide for target user profile, value proposition, and user stories for v1.2","fileTypesAndContributionMap":{}}]}],"KhoonSun47":[{"date":"2024-03-04","commitResults":[{"hash":"01368656f2edde1c9467693dfcc5131537fb69fd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103-F09-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"26ae6d0094063f4a27b0ef46714554a9e01bb351","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/KhoonSun47/tp","messageBody":"* \u0027master\u0027 of https://github.com/KhoonSun47/tp:\n Update EstateEase Developer Guide\n Update EstateEase Developer Guide\n Update README page\n Update AboutUs page\n Rename zhengyang.png. to zhengyang.png\n Rename zhengyang.png.jpg to zhengyang.png\n Added profile pic\n","fileTypesAndContributionMap":{}},{"hash":"6fad1deb95133281b72c04e334974643a7c904e8","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"DeveloperGuide.md: Add use case UC01 - Add home-owners to user\u0027s contact list\n","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":0}}}]},{"date":"2024-03-05","commitResults":[{"hash":"39d821f3983b8553e926a051c0e7504c51606f7a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/KhoonSun47/tp","messageBody":"* \u0027master\u0027 of https://github.com/KhoonSun47/tp:\n Update EstateEase Developer Guide\n","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"9c678a970ea4c01ad7863aab42411d594315039c","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103-F09-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"fd5759366ace9523711b83bb0655dacb4dc5f29c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/KhoonSun47/tp","messageBody":"* \u0027master\u0027 of https://github.com/KhoonSun47/tp:\n Update use case UC02: View All\n","fileTypesAndContributionMap":{}},{"hash":"8d67e3756f21be7b57221eb7eb6afd2597018790","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103-F09-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"dc3c3055fca14262a2702ada544b7a37a4233c68","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/KhoonSun47/tp","messageBody":"* \u0027master\u0027 of https://github.com/KhoonSun47/tp:\n Add UC04 to the developer guide\n","fileTypesAndContributionMap":{}},{"hash":"3f5d997c10019e6deb573612979cd712a41625e0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-update-developer-guide","messageBody":"* master:\n Add UC04 to the developer guide\n Update use case UC02: View All\n","fileTypesAndContributionMap":{}},{"hash":"2f0a129ab9360eefb6dda1e4e415a25716f16c6d","isMergeCommit":false,"messageTitle":"Add new informations to the developer guide","messageBody":"- Update DeveloperGuide.md: Add 3 new uses cases (add home-buyer, add homes and view home-seller based on priority)\nand edit current use case (add home-seller), update non-functional requirements and glossary\n","fileTypesAndContributionMap":{"docs":{"insertions":167,"deletions":15}}},{"hash":"b857685eb99d77591b1b53bc8eb882dcec5141f9","isMergeCommit":true,"messageTitle":"Merge pull request #31 from felixchanyy/branch-update-user-guide","messageBody":"Remove traces of AB3 in user guide","fileTypesAndContributionMap":{}},{"hash":"6992bbbac27416a58fc90bd231d4eb31ffd5dc0b","isMergeCommit":false,"messageTitle":"Update numbering in use cases","messageBody":"Update DeveloperGuide.md: Update use cases numbering in ascending format\n","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]}],"felixchanyy":[{"date":"2024-02-25","commitResults":[{"hash":"49ea064856c7f445023492f187e586955a8ff914","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1c557117b928997147adacbfbaa2a51e621be928","isMergeCommit":true,"messageTitle":"Merge pull request #1 from felixchanyy/switch-docs-to-markbind","messageBody":"Add branch Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"437dc448a25a27a4e80aadfba9c9ff559fff86df","isMergeCommit":false,"messageTitle":"Set up MarkBind website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3ec6fbcede9e2331e865e8c9013ed12ba595a14a","isMergeCommit":true,"messageTitle":"Merge pull request #2 from felixchanyy/master","messageBody":"Set up MarkBind website","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"a47aa2b24342c77b8db32c2a23911555036fb767","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add roles and individual profile pic\n","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":30}}},{"hash":"2d9d3d2668b299b07b49e579c65b1bf0555729f1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from felixchanyy/branch-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14246bf45fe143d902d1bf5bbebbd07da5eca49a","isMergeCommit":false,"messageTitle":"Update README page","messageBody":"Make changes to Ui mock up, update link of Github Actions badge\nand the content of the page.\n","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":11}}},{"hash":"d73491577039858c93774a124ef2be0533b6dbad","isMergeCommit":true,"messageTitle":"Merge pull request #16 from felixchanyy/branch-readme","messageBody":"Update README page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"1ad435b1386fa665892fa770ed9207d884c6f925","isMergeCommit":true,"messageTitle":"Merge pull request #23 from redcolorbicycle/master","messageBody":"Update use case UC02: View All","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"72493228177456b4fe4b3ecfee2cc3f0ec018f10","isMergeCommit":false,"messageTitle":"Add UC04 to the developer guide","messageBody":"The developer guide lacked information about loading contact data from\na JSON file (UC04). This addition provides detailed steps for\nloading contact data and handling various scenarios such as missing\nor empty JSON files, and non-existent data folders.\n\nThis change is made to ensure that developers have clear instructions\non how the application loads contact data, including the handling of\npotential errors or missing files.\n\nThis commit completes the coverage of contact data management\nin the developer guide, enhancing the documentation\u0027s comprehensiveness.\n","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":4}}},{"hash":"9868c642a892cd48db9bf604ce35a91533343030","isMergeCommit":true,"messageTitle":"Merge pull request #24 from felixchanyy/branch-update-developer-guide","messageBody":"Add UC04 (Load) to the developer guide","fileTypesAndContributionMap":{}},{"hash":"2ad14c5e519a8b402d28415a1b9cd792969b8933","isMergeCommit":false,"messageTitle":"Remove traces of AB3","messageBody":"Adapt to new product EstateEase\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"lokidoki102":[{"date":"2024-03-04","commitResults":[{"hash":"e619f001b6abc4609e4ad77c553f802c6e7d06aa","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Add use case (textual) for save to storage.\nUpdate delete contact use case to include use case number.\n","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":2}}},{"hash":"3d096c0e453bb7ffdd1a615edff7e8a7e1cab953","isMergeCommit":true,"messageTitle":"Merge pull request #19 from lokidoki102/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"redcolorbicycle":{"docs":15,"functional-code":0,"test-code":0},"zengzihui":{"docs":13,"functional-code":0,"test-code":0},"KhoonSun47":{"docs":247,"functional-code":0,"test-code":0},"felixchanyy":{"docs":110,"functional-code":0,"test-code":0},"lokidoki102":{"docs":26,"functional-code":0,"test-code":0}},"authorContributionVariance":{"redcolorbicycle":18.177515,"zengzihui":68.23669,"KhoonSun47":3053.4438,"felixchanyy":856.852,"lokidoki102":63.90533},"authorDisplayNameMap":{"redcolorbicycle":"CS2103-F09-1 LIU ..YANG","zengzihui":"CS2103-F09-1 ZENG..IHUI","KhoonSun47":"CS2103-F09-1 YEK .. SUN","felixchanyy":"CS2103-F09-1 FELI..YUAN","lokidoki102":"CS2103-F09-1 LIM ..RATO"}} diff --git a/AY2324S2-CS2103-F09-2_tp_master/authorship.json b/AY2324S2-CS2103-F09-2_tp_master/authorship.json index 84f9732e..3f67d57a 100644 --- a/AY2324S2-CS2103-F09-2_tp_master/authorship.json +++ b/AY2324S2-CS2103-F09-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":"-"},"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":"NeoHW"},"content":"### Neo Haowei","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"NeoHW"},"content":"\u003cimg src\u003d\"images/neohw.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"NeoHW"},"content":"[[github](http://github.com/NeoHW)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"NeoHW"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"NeoHW"},"content":"* Responsibilities: Overall project coordination, code review","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"SherisseTJW"},"content":"### Sherisse Tan Jing Wen","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"SherisseTJW"},"content":"\u003cimg src\u003d\"images/sherissetjw.PNG\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"SherisseTJW"},"content":"[[github](http://github.com/SherisseTJW)] [[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"SherisseTJW"},"content":"* Role: Integration","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"SherisseTJW"},"content":"* Responsibilities: In charge of versioning of the code, maintaining the code repository,","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"SherisseTJW"},"content":"integrating various parts of the software to create a whole.","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"guohuang88"},"content":"### Li Guohuang","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"guohuang88"},"content":"\u003cimg src\u003d\"images/guohuang88.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"guohuang88"},"content":"[[github](http://github.com/guohuang88)]","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"guohuang88"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"guohuang88"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"guohuang88"},"content":"* Responsibilities: Ensure project is tested properly and on time.","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"ZhiWei1010"},"content":"### Tan Zhi Wei","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"ZhiWei1010"},"content":"\u003cimg src\u003d\"images/zhiwei1010.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"ZhiWei1010"},"content":"[[github](http://github.com/ZhiWei1010)]","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"ZhiWei1010"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"ZhiWei1010"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"ZhiWei1010"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format.","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"SherisseTJW"},"content":"### Johnny Doe","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"SherisseTJW"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"SherisseTJW"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"guohuang88":6,"SherisseTJW":9,"ZhiWei1010":6,"NeoHW":5,"-":35}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003ePatientSync\u003c/a\u003e","lastModifiedDate":"2024-02-18"},{"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":"NeoHW"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103-F09-2/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"NeoHW":1,"-":66}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"NeoHW"},"content":"# PatientSync","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"NeoHW"},"content":"**PatientSync is a desktop application meticulously crafted for nurses who prioritize the well-being of their patients above all else.** ","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"NeoHW"},"content":"It allows you to input intimate details about your patients, such as food preferences and family conditions. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"NeoHW"},"content":"| Project Links | Description |","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"NeoHW"},"content":"|-------------------------|------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"NeoHW"},"content":"| [Project Website](https://ay2324s2-cs2103-f09-2.github.io/tp/) | Official website for the PatientSync desktop application. |","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"NeoHW"},"content":"| [User Guide](UserGuide.html#quick-start) | Quick Start guide for users interested in using PatientSync. |","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"NeoHW"},"content":"| [Developer Guide](DeveloperGuide.html) | Comprehensive guide for developers interested in contributing to PatientSync. |","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"NeoHW"},"content":"| [About Us](AboutUs.html) | Learn more about the team behind the PatientSync project. |","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"**Acknowledgements** ","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"NeoHW"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"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":{"NeoHW":10,"-":18}}] +[{"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-CS2103-F09-2/tp/graph/badge.svg?token\u003dAX3SGG0FMX)](https://codecov.io/gh/AY2324S2-CS2103-F09-2/tp) ","lastModifiedDate":"2024-02-18"},{"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":"NeoHW"},"content":"**PatientSync is a desktop application meticulously crafted for nurses who prioritize the well-being of their patients above all else.** ","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"NeoHW"},"content":"It allows you to input intimate details about your patients, such as food preferences and family conditions. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"NeoHW"},"content":"## User Profile","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"NeoHW"},"content":"**Target Users:** Nurses in a hospital setting","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"NeoHW"},"content":"**Key Challenges:**","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"NeoHW"},"content":"- Managing diverse patient needs and preferences.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"NeoHW"},"content":"- Providing personalized care while juggling a busy schedule.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"NeoHW"},"content":"- Ensuring accurate and up-to-date patient information is readily accessible.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"NeoHW"},"content":"## Value Proposition","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"NeoHW"},"content":"**PatientSync** is meticulously crafted for nurses who prioritize the well-being of their patients above all else. It allows nurses to input intimate details about their patients, such as food preferences and family conditions. This personalized approach enables nurses to deliver tailored care that meets the unique needs of each individual.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"NeoHW"},"content":"| Project Links | Description |","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"NeoHW"},"content":"|-------------------------|------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"NeoHW"},"content":"| [Project Website](https://ay2324s2-cs2103-f09-2.github.io/tp/) | Official website for the PatientSync desktop application. |","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"NeoHW"},"content":"| [User Guide](UserGuide.html#quick-start) | Quick Start guide for users interested in using PatientSync. |","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"NeoHW"},"content":"| [Developer Guide](DeveloperGuide.html) | Comprehensive guide for developers interested in contributing to PatientSync. |","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"NeoHW"},"content":"| [About Us](AboutUs.html) | Learn more about the team behind the PatientSync project. |","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"NeoHW"},"content":"**Acknowledgements** ","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"NeoHW"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"NeoHW"},"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":35,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"NeoHW":31,"-":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":"NeoHW"},"content":"### Neo Haowei","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"NeoHW"},"content":"\u003cimg src\u003d\"images/neohw.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"NeoHW"},"content":"[[github](http://github.com/NeoHW)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"NeoHW"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"NeoHW"},"content":"* Responsibilities: Overall project coordination, code review","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"SherisseTJW"},"content":"### Sherisse Tan Jing Wen","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"SherisseTJW"},"content":"\u003cimg src\u003d\"images/sherissetjw.PNG\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"SherisseTJW"},"content":"[[github](http://github.com/SherisseTJW)] [[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"SherisseTJW"},"content":"* Role: Integration","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"SherisseTJW"},"content":"* Responsibilities: In charge of versioning of the code, maintaining the code repository,","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"SherisseTJW"},"content":"integrating various parts of the software to create a whole.","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"guohuang88"},"content":"### Li Guohuang","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"guohuang88"},"content":"\u003cimg src\u003d\"images/guohuang88.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"guohuang88"},"content":"[[github](http://github.com/guohuang88)]","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"guohuang88"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"guohuang88"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"guohuang88"},"content":"* Responsibilities: Ensure project is tested properly and on time.","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"ZhiWei1010"},"content":"### Tan Zhi Wei","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"ZhiWei1010"},"content":"\u003cimg src\u003d\"images/zhiwei1010.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"ZhiWei1010"},"content":"[[github](http://github.com/ZhiWei1010)]","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"ZhiWei1010"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"ZhiWei1010"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"ZhiWei1010"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format.","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"SherisseTJW"},"content":"### Johnny Doe","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"SherisseTJW"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"SherisseTJW"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"guohuang88":6,"SherisseTJW":9,"ZhiWei1010":6,"NeoHW":5,"-":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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"NeoHW"},"content":"- has a need to manage a significant number of patients ","lastModifiedDate":"2024-03-06"},{"lineNumber":278,"author":{"gitId":"NeoHW"},"content":"- values comprehensive patient information for tailored treatment","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"NeoHW"},"content":"- prefer desktop apps over other types ","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"NeoHW"},"content":"- can type fast ","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"NeoHW"},"content":"- prefers typing to mouse interactions ","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"NeoHW"},"content":"- is reasonably comfortable using CLI apps","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"NeoHW"},"content":"**Value proposition**: ","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"NeoHW"},"content":"- manage patients\u0027 information faster than a typical mouse/GUI driven app","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":"NeoHW"},"content":"|----------|--------------------------------------------|------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | easily view the user guide | learn more about the product and how to use whenever I need to |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | add patient\u0027s information | add new patients and easily remember their preferences to make a personalized connection |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | delete patient\u0027s information | remove patients who have been discharged |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | list all patient\u0027s information | easily find the details of my patients |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | add important dates for my patients | keep track of my patients\u0027 appointments and see my overall schedule |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | delete important dates for my patients | delete my patients\u0027 appointments if they are canceled |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | add tags to my patients | group the patients into categories |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | find patient with a specific tag | quickly locate individuals with similar conditions, treatments, or requirements without having to scroll through the entire patient list |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"NeoHW"},"content":"| `***` | Nurse | save all previously added patients | ensure details of the patient would not be lost |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"NeoHW"},"content":"| `**` | Nurse | edit patient\u0027s information | have the most updated information of my patients at all times |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"NeoHW"},"content":"| `**` | Nurse | edit important dates for my patients | edit my patients\u0027 appointments if they are changed |","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"NeoHW"},"content":"| `**` | Nurse | edit tags from my patients | edit mistyped tags |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"NeoHW"},"content":"| `**` | Nurse | delete tags from my patients | delete the tag if it no longer applies |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"NeoHW"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"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":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"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":342,"author":{"gitId":"NeoHW"},"content":"2. Should be able to hold up to 1000 patients without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"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":344,"author":{"gitId":"NeoHW"},"content":"4. Should operate without the need for internet access to fulfill its core purpose.","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"NeoHW"},"content":"5. Should be designed to be usable by a person new to patient management without extensive training.","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"NeoHW"},"content":"6. Should provide clear, comprehensive error messages in plain language, guiding users on how to recover from errors due to incorrect inputs. ","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"NeoHW"},"content":"7. Should offer comprehensive, well-organized user documentation that guides users on how to effectively use PatientSync.","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"NeoHW"},"content":"8. Should provide detailed developer documentation for those looking to enhance, customize, or develop extensions. ","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":353,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":363,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":364,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"NeoHW":29,"-":379}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003ePatientSync\u003c/a\u003e","lastModifiedDate":"2024-02-18"},{"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":"NeoHW"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103-F09-2/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"NeoHW":1,"-":66}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"NeoHW"},"content":"# PatientSync","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"NeoHW"},"content":"**PatientSync is a desktop application meticulously crafted for nurses who prioritize the well-being of their patients above all else.** ","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"NeoHW"},"content":"It allows you to input intimate details about your patients, such as food preferences and family conditions. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"NeoHW"},"content":"| Project Links | Description |","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"NeoHW"},"content":"|-------------------------|------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"NeoHW"},"content":"| [Project Website](https://ay2324s2-cs2103-f09-2.github.io/tp/) | Official website for the PatientSync desktop application. |","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"NeoHW"},"content":"| [User Guide](UserGuide.html#quick-start) | Quick Start guide for users interested in using PatientSync. |","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"NeoHW"},"content":"| [Developer Guide](DeveloperGuide.html) | Comprehensive guide for developers interested in contributing to PatientSync. |","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"NeoHW"},"content":"| [About Us](AboutUs.html) | Learn more about the team behind the PatientSync project. |","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"**Acknowledgements** ","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"NeoHW"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"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":{"NeoHW":10,"-":18}}] diff --git a/AY2324S2-CS2103-F09-2_tp_master/commits.json b/AY2324S2-CS2103-F09-2_tp_master/commits.json index 99f30767..f50efef2 100644 --- a/AY2324S2-CS2103-F09-2_tp_master/commits.json +++ b/AY2324S2-CS2103-F09-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"guohuang88":[{"date":"2024-03-05","commitResults":[{"hash":"67cb69188c5c4655d8709f6ce3bc0bc089286207","isMergeCommit":false,"messageTitle":"Update AboutUs.md to add profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"SherisseTJW":[{"date":"2024-03-04","commitResults":[{"hash":"6aaaf3fa750fe83176ac00adc3f7c0e0c15d20df","isMergeCommit":true,"messageTitle":"Merge pull request #22 from NeoHW/V1.1-AddProfilePic","messageBody":"V1.1 add profile pic","fileTypesAndContributionMap":{}},{"hash":"8f2224d5f8fdee7802fa4b96d441a0695cec983a","isMergeCommit":true,"messageTitle":"Merge pull request #23 from ZhiWei1010/v1.1-add-profile-picture","messageBody":"Update AboutUs.md for milestone v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"482117fa53f473a152cfe2ebcdef1b577b0a0592","isMergeCommit":false,"messageTitle":"doc: Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":5}}},{"hash":"2b8ae16bc2f7c127ca668df2013bf003b541b9ae","isMergeCommit":false,"messageTitle":"minor-doc-fix: Style Errors in build","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"ZhiWei1010":[{"date":"2024-03-04","commitResults":[{"hash":"a82460a19c98af3bf8d133548113d352c4fa7484","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add profile picture.\n\nUpdate github link to redirect to personal github page.\n\nUpdate portfolio link to redirect to team portfolio page.\n\nUpdate role and responsibility for Tan Zhi Wei .\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"choowengyan":[],"NeoHW":[{"date":"2024-03-04","commitResults":[{"hash":"f5d917cdba85f6ffece8081e08c2f775decdf8e7","isMergeCommit":false,"messageTitle":"Update AboutUs.md for milestone 1.1","messageBody":"- Updated profile photo, role, and responsibilities for Neo Haowei\n\nThis commit updates the AboutUs.md page for milestone 1.1.\nNeo Haowei\u0027s profile photo, GitHub link, and portfolio link\nhave been added.\n\nFixes #16\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":15}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a65df35e86510160985bb9c3de8dce3110b2c1fd","isMergeCommit":true,"messageTitle":"Merge pull request #24 from guohuang88/branch-AboutUs","messageBody":"Update AboutUs.md to add profile picture","fileTypesAndContributionMap":{}},{"hash":"5ddc688b9f6f5ea9a1ec4282d54c0fcae2d3cfc1","isMergeCommit":false,"messageTitle":"feat: Adapt MarkBind site for project","messageBody":"- Added GitHub Actions write permissions for repo\n- Updated site configs to match project fork:\n\t- Updated baseUrl in .github/workflows/docs.yml\n\t- Updated product name in docs/_markbind/layouts/default.md\n\t- Updated titlePrefix in docs/site.json\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"2e708a81e0b936532dc595f3dbe1aa318ab98d30","isMergeCommit":false,"messageTitle":"Update index.md for PatientSync","messageBody":"The index.md file was previously tailored for the addressbook3 project.\nThis commit updates the content to reflect new PatientSync project,\nincluding the project name, description, and relevant links.\n\nThe changes include:\n* Updating the project name to PatientSync\n* Updating the project description\n\nThis update is necessary to provide accurate and relevant information\nabout the PatientSync project on the main page of the documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"0cf51d0f1f89bddbe1499a73f833a20d467e6ddb","isMergeCommit":true,"messageTitle":"Merge pull request #27 from NeoHW/V1.1-UpdateProjectWebsite","messageBody":"V1.1 update project website","fileTypesAndContributionMap":{}},{"hash":"eda06224df402de86a3f0904da58212475e29211","isMergeCommit":false,"messageTitle":"Add acknowledgements to home readme","messageBody":"Give acknowledgements that this project is based on the\nAddressBook-Level3 project created by the SE-EDU intiative\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}},{"hash":"d02733d664171f860738bb3e9ebc4a9736f450eb","isMergeCommit":false,"messageTitle":"Beautify and Add Descriptions for Project Links","messageBody":"Improve the presentation of project links by using a table format.\nAlso provide descriptions for each link to give users more context.\nThis enhances readability and provides users with quick insights\ninto the purpose of each link.\n\nThese changes aim to make navigating the project resources\neasier for users and developers alike.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}},{"hash":"984452c8305e842ee7e774fbd53b2c55ac12aba9","isMergeCommit":true,"messageTitle":"Merge pull request #29 from NeoHW/V1.1-Acknowledgement","messageBody":"V1.1 acknowledgement + Project Links table in Home Page","fileTypesAndContributionMap":{}},{"hash":"d9db09659f2cd43dbf00a82f3006f9092bd33f25","isMergeCommit":true,"messageTitle":"Merge pull request #33 from SherisseTJW/doc/update-dev-docs","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"guohuang88":{"docs":6,"functional-code":0,"test-code":0},"SherisseTJW":{"docs":9,"functional-code":0,"test-code":0},"ZhiWei1010":{"docs":6,"functional-code":0,"test-code":0},"choowengyan":{"docs":0,"functional-code":0,"test-code":0},"NeoHW":{"docs":16,"functional-code":0,"test-code":0}},"authorContributionVariance":{"guohuang88":10.224853,"SherisseTJW":40.89941,"ZhiWei1010":10.224852,"choowengyan":0.0,"NeoHW":54.059177},"authorDisplayNameMap":{"guohuang88":"CS2103-F09-2 LI G..UANG","SherisseTJW":"CS2103-F09-2 SHER.. WEN","ZhiWei1010":"CS2103-F09-2 TAN .. WEI","choowengyan":"CS2103-F09-2 CHOO.. YAN","NeoHW":"CS2103-F09-2 NEO ..OWEI"}} +{"authorDailyContributionsMap":{"guohuang88":[{"date":"2024-03-05","commitResults":[{"hash":"67cb69188c5c4655d8709f6ce3bc0bc089286207","isMergeCommit":false,"messageTitle":"Update AboutUs.md to add profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]},{"date":"2024-03-06","commitResults":[{"hash":"2210a0fd7846a8923b1777796d49469dfec2ffed","isMergeCommit":true,"messageTitle":"Merge pull request #39 from NeoHW/V1.1-ReadMe","messageBody":"Update README with project details and UI mockup","fileTypesAndContributionMap":{}},{"hash":"309a95f89f3ec28c2b56dbbd2b5c3187ff494248","isMergeCommit":true,"messageTitle":"Merge pull request #38 from NeoHW/V1.1-UserStories","messageBody":"Add Nurse user stories for PatientSync","fileTypesAndContributionMap":{}}]}],"SherisseTJW":[{"date":"2024-03-04","commitResults":[{"hash":"6aaaf3fa750fe83176ac00adc3f7c0e0c15d20df","isMergeCommit":true,"messageTitle":"Merge pull request #22 from NeoHW/V1.1-AddProfilePic","messageBody":"V1.1 add profile pic","fileTypesAndContributionMap":{}},{"hash":"8f2224d5f8fdee7802fa4b96d441a0695cec983a","isMergeCommit":true,"messageTitle":"Merge pull request #23 from ZhiWei1010/v1.1-add-profile-picture","messageBody":"Update AboutUs.md for milestone v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"482117fa53f473a152cfe2ebcdef1b577b0a0592","isMergeCommit":false,"messageTitle":"doc: Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":5}}},{"hash":"2b8ae16bc2f7c127ca668df2013bf003b541b9ae","isMergeCommit":false,"messageTitle":"minor-doc-fix: Style Errors in build","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"ZhiWei1010":[{"date":"2024-03-04","commitResults":[{"hash":"a82460a19c98af3bf8d133548113d352c4fa7484","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add profile picture.\n\nUpdate github link to redirect to personal github page.\n\nUpdate portfolio link to redirect to team portfolio page.\n\nUpdate role and responsibility for Tan Zhi Wei .\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]},{"date":"2024-03-06","commitResults":[{"hash":"6b44c9a59d9a65c8cec1f010d9a69d83e9528584","isMergeCommit":true,"messageTitle":"Merge pull request #32 from NeoHW/V1.1-DG-UserProfile-and-ValueProposition","messageBody":"Adapt target user profile and value proposition to fit PatientSync","fileTypesAndContributionMap":{}},{"hash":"95fb1f028ea0bd024712a4282e0a72561288eea7","isMergeCommit":true,"messageTitle":"Merge pull request #37 from NeoHW/V1.1-DG-NFR","messageBody":"Update non-functional requirements to match Patientsync","fileTypesAndContributionMap":{}}]}],"choowengyan":[],"NeoHW":[{"date":"2024-03-04","commitResults":[{"hash":"f5d917cdba85f6ffece8081e08c2f775decdf8e7","isMergeCommit":false,"messageTitle":"Update AboutUs.md for milestone 1.1","messageBody":"- Updated profile photo, role, and responsibilities for Neo Haowei\n\nThis commit updates the AboutUs.md page for milestone 1.1.\nNeo Haowei\u0027s profile photo, GitHub link, and portfolio link\nhave been added.\n\nFixes #16\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":15}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a65df35e86510160985bb9c3de8dce3110b2c1fd","isMergeCommit":true,"messageTitle":"Merge pull request #24 from guohuang88/branch-AboutUs","messageBody":"Update AboutUs.md to add profile picture","fileTypesAndContributionMap":{}},{"hash":"5ddc688b9f6f5ea9a1ec4282d54c0fcae2d3cfc1","isMergeCommit":false,"messageTitle":"feat: Adapt MarkBind site for project","messageBody":"- Added GitHub Actions write permissions for repo\n- Updated site configs to match project fork:\n\t- Updated baseUrl in .github/workflows/docs.yml\n\t- Updated product name in docs/_markbind/layouts/default.md\n\t- Updated titlePrefix in docs/site.json\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"2e708a81e0b936532dc595f3dbe1aa318ab98d30","isMergeCommit":false,"messageTitle":"Update index.md for PatientSync","messageBody":"The index.md file was previously tailored for the addressbook3 project.\nThis commit updates the content to reflect new PatientSync project,\nincluding the project name, description, and relevant links.\n\nThe changes include:\n* Updating the project name to PatientSync\n* Updating the project description\n\nThis update is necessary to provide accurate and relevant information\nabout the PatientSync project on the main page of the documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"0cf51d0f1f89bddbe1499a73f833a20d467e6ddb","isMergeCommit":true,"messageTitle":"Merge pull request #27 from NeoHW/V1.1-UpdateProjectWebsite","messageBody":"V1.1 update project website","fileTypesAndContributionMap":{}},{"hash":"eda06224df402de86a3f0904da58212475e29211","isMergeCommit":false,"messageTitle":"Add acknowledgements to home readme","messageBody":"Give acknowledgements that this project is based on the\nAddressBook-Level3 project created by the SE-EDU intiative\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}},{"hash":"d02733d664171f860738bb3e9ebc4a9736f450eb","isMergeCommit":false,"messageTitle":"Beautify and Add Descriptions for Project Links","messageBody":"Improve the presentation of project links by using a table format.\nAlso provide descriptions for each link to give users more context.\nThis enhances readability and provides users with quick insights\ninto the purpose of each link.\n\nThese changes aim to make navigating the project resources\neasier for users and developers alike.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}},{"hash":"984452c8305e842ee7e774fbd53b2c55ac12aba9","isMergeCommit":true,"messageTitle":"Merge pull request #29 from NeoHW/V1.1-Acknowledgement","messageBody":"V1.1 acknowledgement + Project Links table in Home Page","fileTypesAndContributionMap":{}},{"hash":"b88e1ec8fa11980ba8a00b6e93bd39807072e8fe","isMergeCommit":false,"messageTitle":"Adapt target user profile and value proposition to fit PatientSync","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":7}}},{"hash":"d9db09659f2cd43dbf00a82f3006f9092bd33f25","isMergeCommit":true,"messageTitle":"Merge pull request #33 from SherisseTJW/doc/update-dev-docs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c7d64c91a4ecdc88a78f006d93a99691fb7f46a0","isMergeCommit":false,"messageTitle":"Update non-functional requirements to match Patientsync","messageBody":"Also added new NFRs\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":3}}},{"hash":"e5caacd65bbbf9346c8478e994f55411842ccd46","isMergeCommit":false,"messageTitle":"Add Nurse user stories for PatientSync","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":9}}},{"hash":"40d40baf6bf3012822a7c022ff455284f1d1a85a","isMergeCommit":false,"messageTitle":"Update README with project details and UI mockup","messageBody":"- Updated the README to reflect the project\u0027s target users\nand key challenges\n- Added a UI mockup image\n- Acknowledged the original source of the code\n","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":10}}}]}]},"authorFileTypeContributionMap":{"guohuang88":{"docs":6,"functional-code":0,"test-code":0},"SherisseTJW":{"docs":9,"functional-code":0,"test-code":0},"ZhiWei1010":{"docs":6,"functional-code":0,"test-code":0},"choowengyan":{"docs":0,"functional-code":0,"test-code":0},"NeoHW":{"docs":76,"functional-code":0,"test-code":0}},"authorContributionVariance":{"guohuang88":10.224853,"SherisseTJW":40.89941,"ZhiWei1010":10.224852,"choowengyan":0.0,"NeoHW":889.7514},"authorDisplayNameMap":{"guohuang88":"CS2103-F09-2 LI G..UANG","SherisseTJW":"CS2103-F09-2 SHER.. WEN","ZhiWei1010":"CS2103-F09-2 TAN .. WEI","choowengyan":"CS2103-F09-2 CHOO.. YAN","NeoHW":"CS2103-F09-2 NEO ..OWEI"}} diff --git a/AY2324S2-CS2103-F09-3_tp_master/authorship.json b/AY2324S2-CS2103-F09-3_tp_master/authorship.json index c198a504..ab32a067 100644 --- a/AY2324S2-CS2103-F09-3_tp_master/authorship.json +++ b/AY2324S2-CS2103-F09-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: 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":"biinnnggggg"},"content":"### Chin Zhe Ning","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"biinnnggggg"},"content":"\u003cimg src\u003d\"images/biinnnggggg.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"biinnnggggg"},"content":"[[github](https://github.com/biinnnggggg)]","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"biinnnggggg"},"content":"* Role: -","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"biinnnggggg"},"content":"* Responsibilities: -","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"JonChong98"},"content":"### Jonathan Chong","lastModifiedDate":"2024-03-03"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"JonChong98"},"content":"\u003cimg src\u003d\"images/jonchong98.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"JonChong98"},"content":"[[github](http://github.com/jonchong98)]","lastModifiedDate":"2024-03-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"JonChong98"},"content":"* Role: -","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"JonChong98"},"content":"* Responsibilities: -","lastModifiedDate":"2024-03-03"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Darylgolden"},"content":"### Darylgolden","lastModifiedDate":"2024-03-03"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Darylgolden"},"content":"\u003cimg src\u003d\"images/darylgolden.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Darylgolden"},"content":"[[github](http://github.com/darylgolden)]","lastModifiedDate":"2024-03-03"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Darylgolden"},"content":"* Role: -","lastModifiedDate":"2024-03-03"},{"lineNumber":37,"author":{"gitId":"Darylgolden"},"content":"* Responsibilities: -","lastModifiedDate":"2024-03-03"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"TopKec"},"content":"### Aidan Goh","lastModifiedDate":"2024-03-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"TopKec"},"content":"\u003cimg src\u003d\"images/topkec.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"TopKec"},"content":"[[github](https://github.com/TopKec)]","lastModifiedDate":"2024-03-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"TopKec"},"content":"* Role: -","lastModifiedDate":"2024-03-03"},{"lineNumber":46,"author":{"gitId":"TopKec"},"content":"* Responsibilities: -","lastModifiedDate":"2024-03-03"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"tanqinyong"},"content":"### Tan Qin Yong","lastModifiedDate":"2024-03-03"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"tanqinyong"},"content":"\u003cimg src\u003d\"images/tanqinyong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"tanqinyong"},"content":"[[github](http://github.com/tanqinyong)]","lastModifiedDate":"2024-03-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"tanqinyong"},"content":"* Role: -","lastModifiedDate":"2024-03-03"},{"lineNumber":55,"author":{"gitId":"tanqinyong"},"content":"* Responsibilities: -","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"Darylgolden":5,"biinnnggggg":5,"TopKec":5,"-":30,"tanqinyong":5,"JonChong98":5}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Darylgolden"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F09-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F09-3/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":"biinnnggggg"},"content":"**TutorRec** is a desktop application for tutors to manage client contacts.","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"biinnnggggg"},"content":"It is","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"biinnnggggg"},"content":"- CLI based","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"biinnnggggg"},"content":"- with a simple GUI","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"biinnnggggg"},"content":"- and super-fast to use.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"biinnnggggg"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"biinnnggggg"},"content":"### Links","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"biinnnggggg"},"content":"- [Project Website](https://ay2324s2-cs2103-f09-3.github.io/tp/)","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"biinnnggggg"},"content":"- [User Guide](https://ay2324s2-cs2103-f09-3.github.io/tp/UserGuide.html)","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"biinnnggggg"},"content":"- [Developer Guide](https://ay2324s2-cs2103-f09-3.github.io/tp/DeveloperGuide.html)","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"biinnnggggg"},"content":"- [About Us](https://ay2324s2-cs2103-f09-3.github.io/tp/AboutUs.html)","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"biinnnggggg"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"biinnnggggg"},"content":"### Acknowledgements","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"biinnnggggg"},"content":"- This project is **a part of the se-education.org initiative**. If you would","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"biinnnggggg"},"content":"like to contribute code to this project, see","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"biinnnggggg"},"content":"[se-education.org](https://se-education.org/#https://se-education.org/#contributing) for more","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"biinnnggggg"},"content":"info.","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Darylgolden":1,"biinnnggggg":17,"-":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":"biinnnggggg"},"content":"### Chin Zhe Ning","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"biinnnggggg"},"content":"\u003cimg src\u003d\"images/biinnnggggg.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"biinnnggggg"},"content":"[[github](https://github.com/biinnnggggg)]","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"biinnnggggg"},"content":"* Roles: Documentation, In charge of `Logic`","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"biinnnggggg"},"content":"* Responsibilities: looks after quality of various project documents, diagrams and the `Logic` component","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"JonChong98"},"content":"### Jonathan Chong","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"JonChong98"},"content":"\u003cimg src\u003d\"images/jonchong98.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"JonChong98"},"content":"[[github](http://github.com/jonchong98)]","lastModifiedDate":"2024-03-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"biinnnggggg"},"content":"* Roles: User Interface design and implementation","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"biinnnggggg"},"content":"* Responsibilities: creating UI mockups and implementing design into product","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Darylgolden"},"content":"### Darylgolden","lastModifiedDate":"2024-03-03"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Darylgolden"},"content":"\u003cimg src\u003d\"images/darylgolden.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Darylgolden"},"content":"[[github](http://github.com/darylgolden)]","lastModifiedDate":"2024-03-03"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"biinnnggggg"},"content":"* Roles: Git expert, Testing, Integration","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"biinnnggggg"},"content":"* Responsibilities: helps other team member with Git matters, ensures","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"biinnnggggg"},"content":" the testing of the project is timely and done properly, In charge of","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"biinnnggggg"},"content":" versioning of the code, maintaining the code repository, integrating","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"biinnnggggg"},"content":" various parts of the software to create a whole.","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"TopKec"},"content":"### Aidan Goh","lastModifiedDate":"2024-03-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"TopKec"},"content":"\u003cimg src\u003d\"images/topkec.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"TopKec"},"content":"[[github](https://github.com/TopKec)]","lastModifiedDate":"2024-03-03"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"biinnnggggg"},"content":"* Role: Code Quality, In charge of `Model` package","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"biinnnggggg"},"content":"* Responsibilities: looks after code quality, ensures adherence to coding","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"biinnnggggg"},"content":"standards, etc., looks after quality of `Model` package","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"tanqinyong"},"content":"### Tan Qin Yong","lastModifiedDate":"2024-03-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"tanqinyong"},"content":"\u003cimg src\u003d\"images/tanqinyong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"tanqinyong"},"content":"[[github](http://github.com/tanqinyong)]","lastModifiedDate":"2024-03-03"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"biinnnggggg"},"content":"* Role: Scheduling and Tracking","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"biinnnggggg"},"content":"* Responsibilities: in charge of defining, assigning and tracking of tasks","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Darylgolden":3,"biinnnggggg":17,"TopKec":3,"-":30,"tanqinyong":3,"JonChong98":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":"Darylgolden"},"content":"* busy home tutor","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"Darylgolden"},"content":"* has a need to manage a large number of students","lastModifiedDate":"2024-03-06"},{"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":"Darylgolden"},"content":"**Value proposition**: provides easy access to client info and organizes it in an efficient and readable way for day-to-day use, optimized for tutors that prefer CLI.","lastModifiedDate":"2024-03-06"},{"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":"Darylgolden"},"content":"| `* *` | new home tutor | have adding information be intuitive and logical | use the app without hassle |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"Darylgolden"},"content":"| `* *` | new user | have a quick start guide | learn how to use the app |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"Darylgolden"},"content":"| `* *` | new home tutor | follow a set syllabus for my clients | |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"Darylgolden"},"content":"| `* *` | new home tutor | be able to quickly create a student’s profile with their relevant information | |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"Darylgolden"},"content":"| `* *` | new home tutor | track the performance of my students | prove to their parents that they are improving and my effectiveness as a tutor |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"Darylgolden"},"content":"| `* * *` | new home tutor | track all my appointments | reduce the chance I forget or double book myself |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"Darylgolden"},"content":"| `* *` | new home tutor | keep track of my finances–such as which client has paid me for my work over a month | reduce my stress when it comes to keeping track of who has paid me for my work, and so forth. |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"Darylgolden"},"content":"| `* *` | busy home tutor | seamlessly create new tasks | quickly and efficiently set up my daily routine |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"Darylgolden"},"content":"| `* *` | busy home tutor | be reminded about my upcoming appointments for the day | not accidentally forget |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"Darylgolden"},"content":"| `* *` | returning home tutor | re-implementation of more information in a large amount to be easy | add information en masse without stress |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"Darylgolden"},"content":"| `* *` | home tutor with clients who are nearing exam season | properly ensure that they are improving as planned, and also allow them to set benchmarks that I can remember | |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"Darylgolden"},"content":"| `* *` | busy home tutor | block certain times out for lunch and dinner | not accidentally overwrite those times with an additional client |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"Darylgolden"},"content":"| `* * *` | experienced home tutor | delete students I am no longer teaching on TutorRec | unclutter my interface |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"Darylgolden"},"content":"| `* * *` | experienced home tutor | update student information and details | ensure accurate records are maintained |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"Darylgolden"},"content":"| `* * *` | passionate home tutor | TutorRec to keep notes for each student | tailor my teaching style accordingly |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"Darylgolden"},"content":"| `* *` | experienced home tutor with many students | ability to categorise students by skill level, subject or group (p1, p2, p3…) | quickly locate their information when needed |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"Darylgolden"},"content":"| `* *` | experienced home tutor | flexibility to choose what to teach my students (custom lessons) | personalise each lesson for different students |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"Darylgolden"},"content":"| `* *` | experienced home tutor | easily identify students with weak performance | focus on weaker students |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"Darylgolden"},"content":"| `* *` | experienced home tutor | view a student’s records for the length of time I have tutored them | |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"Darylgolden"},"content":"| `* *` | experienced home tutor | get some insights and analytics on a student’s performance over time | further refine my teaching methods accordingly |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"Darylgolden"},"content":"| `* *` | busy home tutor | quickly reschedule my appointments with my clients | fit my ever-changing schedule, preventing a large amount of hassle |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"Darylgolden"},"content":"| `* *` | tutor who just received a new wave of clients | separate my old and new clients | keep the interface orderly and easy-to-follow |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"Darylgolden"},"content":"| `* * *` | busy home tutor | make quick notes about my students | keep track of information specific to each client |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"Darylgolden"},"content":"| `* *` | assignment-ridden home tutor | note cancellations in my schedule due to increased workload from my end | my schedule is accurate to reality |","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"Darylgolden"},"content":"| `* *` | wary home tutor | backup and import data | safeguard myself against potential data corruption and/or physical destruction of my devices |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"Darylgolden"},"content":"| `* *` | home tutor with a new device | quickly transfer data from one device to another | prevent the pain of having to input previous data manually |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"Darylgolden"},"content":"| `* *` | online tutor | organize sessions with students in a different country and automatically convert dates and times to my time zone | |","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"Darylgolden"},"content":"| `* *` | online home tutor | keep Zoom links with sessions and other information about the student in one place | |","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"Darylgolden"},"content":"| `* *` | online home tutor with students who are abroad | convert time at a glance | be on time for my student’s lessons |","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"Darylgolden"},"content":"| `* * *` | home tutor who just moved abroad | remove previous clients I cannot tutor due to the distance gap | keep my schedule clean |","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"Darylgolden"},"content":"| `* *` | home tutor who just moved abroad | ways of tagging my students | keep track of different needs arising due to cultural differences |","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"*{More to be added}*","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":"TopKec"},"content":"(For all use cases below, the **System** is the `TutorRec` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"TopKec"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-03-06"},{"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":"TopKec"},"content":"1. User requests to list students","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"TopKec"},"content":"2. TutorRec shows a list of students","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"TopKec"},"content":"3. User requests to delete a specific student in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"TopKec"},"content":"4. TutorRec deletes the student","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"TopKec"},"content":" * 3a1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"TopKec"},"content":"**Use case: Viewing appointments**","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"TopKec"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"TopKec"},"content":"1. User requests to view current appointments for the day","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"TopKec"},"content":"2. TutorRec shows a list of appointments for the day","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"TopKec"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"TopKec"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"TopKec"},"content":"* 1b. User inputs an invalid day format as an input.","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"TopKec"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"TopKec"},"content":" * 1b1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"TopKec"},"content":"**Use case: Sorting students**","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"TopKec"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"TopKec"},"content":"1. User requests to view students of a particular category","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"TopKec"},"content":"2. TutorRec shows a filtered list containing only students with this category","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"TopKec"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"TopKec"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"TopKec"},"content":"* 1b. The given category does not have any students assigned to it.","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"TopKec"},"content":" * 1b1. TutorRec shows an empty list.","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"TopKec"},"content":"* 1c. User inputs an invalid category.","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"TopKec"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"TopKec"},"content":" * 1c1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"TopKec"},"content":"**Use case: Editing a student\u0027s details**","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"TopKec"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"TopKec"},"content":"1. User requests to list students","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"TopKec"},"content":"2. TutorRec displays a list of students","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"TopKec"},"content":"3. User requests to edit the details of a specific student in the list","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"TopKec"},"content":"4. TutorRec updates the details of this student","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"TopKec"},"content":"5. TutorRec displays the updated information of this student","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"TopKec"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"TopKec"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"TopKec"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"TopKec"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"TopKec"},"content":" * 3a1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"TopKec"},"content":"* 3b. User inputs a field that does not exist (e.g. adding a nonexistent /q field).","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"TopKec"},"content":" * 3b1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"TopKec"},"content":"**Use case: Finding a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"TopKec"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"TopKec"},"content":"1. User requests to list all students with a particular name","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"TopKec"},"content":"2. TutorRec displays a reduced list containing all students that meet the criteria of the name requested","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"TopKec"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"TopKec"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":436,"author":{"gitId":"TopKec"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":438,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"TopKec"},"content":"* 1b. No students exist with the given name.","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"TopKec"},"content":" * 1b1. TutorRec displays an empty list.","lastModifiedDate":"2024-03-06"},{"lineNumber":442,"author":{"gitId":"TopKec"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":443,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"TopKec"},"content":"**Use case: Checking improvements of a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"TopKec"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"author":{"gitId":"TopKec"},"content":"1. User requests to list students","lastModifiedDate":"2024-03-06"},{"lineNumber":450,"author":{"gitId":"TopKec"},"content":"2. TutorRec displays a list of students","lastModifiedDate":"2024-03-06"},{"lineNumber":451,"author":{"gitId":"TopKec"},"content":"3. User updates a specific student\u0027s grades for a given test","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"author":{"gitId":"TopKec"},"content":"4. TutorRec updates the grades for this student","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"TopKec"},"content":"5. TutorRec displays that the student\u0027s grades has been updated","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"TopKec"},"content":"6. User requests to view a list of a specific student\u0027s grades","lastModifiedDate":"2024-03-06"},{"lineNumber":455,"author":{"gitId":"TopKec"},"content":"7. TutorRec displays a history of this student\u0027s grades","lastModifiedDate":"2024-03-06"},{"lineNumber":456,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":457,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":458,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":459,"author":{"gitId":"TopKec"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":461,"author":{"gitId":"TopKec"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":462,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":463,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":464,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":465,"author":{"gitId":"TopKec"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":466,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":467,"author":{"gitId":"TopKec"},"content":" * 3a1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":468,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":469,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":470,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":471,"author":{"gitId":"TopKec"},"content":"* 3b. An invalid score is listed as the input.","lastModifiedDate":"2024-03-06"},{"lineNumber":472,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":473,"author":{"gitId":"TopKec"},"content":" * 3b1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":474,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":475,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":476,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":477,"author":{"gitId":"TopKec"},"content":"* 6a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":478,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":479,"author":{"gitId":"TopKec"},"content":" * 6a1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":480,"author":{"gitId":"TopKec"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":481,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"TopKec"},"content":"* 6b. The student has no grades saved.","lastModifiedDate":"2024-03-06"},{"lineNumber":484,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":485,"author":{"gitId":"TopKec"},"content":" * 6b1. TutorRec displays nothing.","lastModifiedDate":"2024-03-06"},{"lineNumber":486,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":487,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":488,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":489,"author":{"gitId":"TopKec"},"content":"**Use case: Updating payment status**","lastModifiedDate":"2024-03-06"},{"lineNumber":490,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":491,"author":{"gitId":"TopKec"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":492,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":493,"author":{"gitId":"TopKec"},"content":"1. User requests to list students","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"TopKec"},"content":"2. TutorRec displays a list of students","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"TopKec"},"content":"3. User chooses to mark a specific student as having made their payment","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"TopKec"},"content":"4. TutorRec updates the payment status of this student to be complete","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"TopKec"},"content":"5. User chooses to mark a specific as not having made their payment","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"TopKec"},"content":"6. TutorRec updates the payment status of this student to be incomplete","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"TopKec"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"TopKec"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":505,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":506,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":507,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":508,"author":{"gitId":"TopKec"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":509,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"TopKec"},"content":" * 3a1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"TopKec"},"content":"* 3b. The student selected already has had their payment marked as made.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"TopKec"},"content":" * 3b1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":519,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":520,"author":{"gitId":"TopKec"},"content":"* 5a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":521,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":522,"author":{"gitId":"TopKec"},"content":" * 5a1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":523,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":524,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":525,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":526,"author":{"gitId":"TopKec"},"content":"* 5b. The student selected already has had their payment marked as made.","lastModifiedDate":"2024-03-06"},{"lineNumber":527,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":528,"author":{"gitId":"TopKec"},"content":" * 5b1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":529,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":530,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":531,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":532,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":533,"author":{"gitId":"TopKec"},"content":"**Use case: Creating an appointment**","lastModifiedDate":"2024-03-06"},{"lineNumber":534,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":535,"author":{"gitId":"TopKec"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":536,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":537,"author":{"gitId":"TopKec"},"content":"1. User requests to list students","lastModifiedDate":"2024-03-06"},{"lineNumber":538,"author":{"gitId":"TopKec"},"content":"2. TutorRec displays a list of students","lastModifiedDate":"2024-03-06"},{"lineNumber":539,"author":{"gitId":"TopKec"},"content":"3. User sets a specific student to have an appointment at a particular time and date","lastModifiedDate":"2024-03-06"},{"lineNumber":540,"author":{"gitId":"TopKec"},"content":"4. TutorRec updates details about this student","lastModifiedDate":"2024-03-06"},{"lineNumber":541,"author":{"gitId":"TopKec"},"content":"5. TutorRec displays details of appointment to user","lastModifiedDate":"2024-03-06"},{"lineNumber":542,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":543,"author":{"gitId":"TopKec"},"content":" End of use case.","lastModifiedDate":"2024-03-06"},{"lineNumber":544,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":545,"author":{"gitId":"TopKec"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":546,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":547,"author":{"gitId":"TopKec"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":548,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":549,"author":{"gitId":"TopKec"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":550,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":551,"author":{"gitId":"TopKec"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":552,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":553,"author":{"gitId":"TopKec"},"content":" * 3a1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":554,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":555,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":556,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":557,"author":{"gitId":"TopKec"},"content":"* 3b. Insufficient information is given to make an appointment.","lastModifiedDate":"2024-03-06"},{"lineNumber":558,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":559,"author":{"gitId":"TopKec"},"content":" * 3b1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":560,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":561,"author":{"gitId":"TopKec"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":562,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":563,"author":{"gitId":"TopKec"},"content":"* 3c. The time and date inputted by the user clashes with an existing appointment previously made by the user.","lastModifiedDate":"2024-03-06"},{"lineNumber":564,"author":{"gitId":"TopKec"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":565,"author":{"gitId":"TopKec"},"content":" * 3c1. TutorRec shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":566,"author":{"gitId":"TopKec"},"content":" * 3c2. TutorRec displays information of student which has an appointment that resulted in the timing clash, and the date and time of this appointment.","lastModifiedDate":"2024-03-06"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":571,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"tanqinyong"},"content":"1. TutorRec should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-06"},{"lineNumber":575,"author":{"gitId":"tanqinyong"},"content":"2. TutorRec should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":576,"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":577,"author":{"gitId":"tanqinyong"},"content":"4. TutorRec is not required to handle multiple users (i.e. multi-user product); it is a single-user product.","lastModifiedDate":"2024-03-06"},{"lineNumber":578,"author":{"gitId":"tanqinyong"},"content":"5. TutorRec needs to be developed in a breadth-first incremental manner, with weekly updates.","lastModifiedDate":"2024-03-06"},{"lineNumber":579,"author":{"gitId":"tanqinyong"},"content":"6. TutorRec\u0027s data should be stored locally and should be in a human editable text file.","lastModifiedDate":"2024-03-06"},{"lineNumber":580,"author":{"gitId":"tanqinyong"},"content":"7. TutorRec should not use a DBMS to store data.","lastModifiedDate":"2024-03-06"},{"lineNumber":581,"author":{"gitId":"tanqinyong"},"content":"8. TutorRec should work without requiring an installer.","lastModifiedDate":"2024-03-06"},{"lineNumber":582,"author":{"gitId":"tanqinyong"},"content":"9. TutorRec should be packaged into a single JAR file for releases. ","lastModifiedDate":"2024-03-06"},{"lineNumber":583,"author":{"gitId":"tanqinyong"},"content":"10. TutorRec\u0027s JAR files should not exceed 100MB.","lastModifiedDate":"2024-03-06"},{"lineNumber":584,"author":{"gitId":"tanqinyong"},"content":"11. The development of TutorRec should follow the Object-oriented paradigm.","lastModifiedDate":"2024-03-06"},{"lineNumber":585,"author":{"gitId":"tanqinyong"},"content":"12. TutorRec should be able to respond within three seconds.","lastModifiedDate":"2024-03-06"},{"lineNumber":586,"author":{"gitId":"tanqinyong"},"content":"13. TutorRec should be designed to function offline.","lastModifiedDate":"2024-03-06"},{"lineNumber":587,"author":{"gitId":"tanqinyong"},"content":"14. TutorRec should not require additional hardware beyond standard computing devices (e.g., desktops, laptops, tablets) commonly availabe to users.","lastModifiedDate":"2024-03-06"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":592,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":594,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":595,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":596,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":597,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":598,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":600,"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":601,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":602,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":605,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":606,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":610,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"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":612,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":614,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":615,"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":616,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":617,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":618,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":619,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":620,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":621,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":622,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":623,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":624,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":625,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":626,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":627,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":628,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":629,"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":630,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":631,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":632,"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":633,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":634,"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":635,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":636,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":637,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":638,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":639,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":640,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":643,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":644,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Darylgolden":34,"TopKec":232,"-":366,"tanqinyong":13}},{"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: TutorRec","lastModifiedDate":"2024-02-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Darylgolden"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F09-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F09-3/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Darylgolden"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F09-3/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2324S2-CS2103-F09-3/tp)","lastModifiedDate":"2024-03-06"},{"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":"**TutorRec 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-02-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* If you are interested in using TutorRec, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-02-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* If you are interested about developing TutorRec, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-02-20"},{"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":{"Darylgolden":2,"-":17}}] diff --git a/AY2324S2-CS2103-F09-3_tp_master/commits.json b/AY2324S2-CS2103-F09-3_tp_master/commits.json index 52bd657f..ce20de8b 100644 --- a/AY2324S2-CS2103-F09-3_tp_master/commits.json +++ b/AY2324S2-CS2103-F09-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Darylgolden":[{"date":"2024-03-03","commitResults":[{"hash":"dc66cf1a750b51ca45656363f70fc284300d3746","isMergeCommit":false,"messageTitle":"Update AboutUs to add information about darylgolden","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}},{"hash":"683956290eae0b4a2dfb63ab1bab0c33a0a26bb1","isMergeCommit":true,"messageTitle":"Merge pull request #35 from tanqinyong/about-us","messageBody":"Update AboutUs for tanqinyong","fileTypesAndContributionMap":{}},{"hash":"cf96bac88f37ec8140a18af6afacbe47b7026e4d","isMergeCommit":true,"messageTitle":"Merge pull request #39 from JonChong98/branch-UpdateImage","messageBody":"Update profile image to png for jonchong98","fileTypesAndContributionMap":{}}]}],"TopKec":[{"date":"2024-03-03","commitResults":[{"hash":"91578d659e5670ae932f8639f9b9a9c2c9d753f5","isMergeCommit":false,"messageTitle":"Update About Me for Aidan","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"eac2cca1cc440c9b570330b54b49f8b3228533b4","isMergeCommit":false,"messageTitle":"Update name of image file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"80025832fe0f17d3e87f3b315a3c29bfc35d008c","isMergeCommit":false,"messageTitle":"Update image file name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"53c99b94ea66c58f32ed722a59288d1a36ca7a50","isMergeCommit":true,"messageTitle":"Merge pull request #34 from TopKec/a-aboutUs","messageBody":"Update AboutUs for topkec","fileTypesAndContributionMap":{}}]}],"biinnnggggg":[{"date":"2024-03-03","commitResults":[{"hash":"69b15ac06915469e90b7448cce8ecf1ad7598043","isMergeCommit":false,"messageTitle":"Update AboutUs for biinnngggggg","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"1d5b12259e9a93ecd64d313756b3d2504f070247","isMergeCommit":false,"messageTitle":"Rename profile picture of biinnnggggg to match github username","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b1b02c902bb468fb382009f5376700a766611ef8","isMergeCommit":true,"messageTitle":"Merge pull request #38 from biinnnggggg/branch-AboutUs","messageBody":"Update AboutUs for biinnngggggg","fileTypesAndContributionMap":{}}]}],"tanqinyong":[{"date":"2024-03-03","commitResults":[{"hash":"2c9993869ee91a7c56f1e2dd49d1d2a62eaa6417","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"Updated the page again with my github\nlink\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"d2e6cd0ccff979b98655f3e10e2e8282bd49fc96","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Darylgolden/AboutUs","messageBody":"Update AboutUs for darylgolden","fileTypesAndContributionMap":{}}]}],"JonChong98":[{"date":"2024-03-03","commitResults":[{"hash":"4c06c592ba8f05d8a3f6f7f0e2383c11ed407818","isMergeCommit":false,"messageTitle":"Update personal details in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"f4535e5f0d1ae01f1e7a0a227bd8860c81182322","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"4f7eb3cb92e35f1996ae9f5959ea55cd0bd5700b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from JonChong98/branch-AboutUs","messageBody":"Update AboutUs for jonchong98","fileTypesAndContributionMap":{}},{"hash":"c075bb1e4805de8f463d3c0b10e61f7dbcf1fa03","isMergeCommit":false,"messageTitle":"Update profile image to png for jonchong98","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"Darylgolden":{"docs":5,"functional-code":0,"test-code":0},"TopKec":{"docs":5,"functional-code":0,"test-code":0},"biinnnggggg":{"docs":5,"functional-code":0,"test-code":0},"tanqinyong":{"docs":5,"functional-code":0,"test-code":0},"JonChong98":{"docs":5,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Darylgolden":12.960001,"TopKec":20.25,"biinnnggggg":15.209999,"tanqinyong":10.889999,"JonChong98":15.209999},"authorDisplayNameMap":{"Darylgolden":"CS2103-F09-3 DARY.. YAO","TopKec":"CS2103-F09-3 GOH ..IDAN","biinnnggggg":"CS2103-F09-3 CHIN..NING","tanqinyong":"CS2103-F09-3 TAN ..YONG","JonChong98":"CS2103-F09-3 JONA..CHYN"}} +{"authorDailyContributionsMap":{"Darylgolden":[{"date":"2024-03-03","commitResults":[{"hash":"dc66cf1a750b51ca45656363f70fc284300d3746","isMergeCommit":false,"messageTitle":"Update AboutUs to add information about darylgolden","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":7}}},{"hash":"683956290eae0b4a2dfb63ab1bab0c33a0a26bb1","isMergeCommit":true,"messageTitle":"Merge pull request #35 from tanqinyong/about-us","messageBody":"Update AboutUs for tanqinyong","fileTypesAndContributionMap":{}},{"hash":"cf96bac88f37ec8140a18af6afacbe47b7026e4d","isMergeCommit":true,"messageTitle":"Merge pull request #39 from JonChong98/branch-UpdateImage","messageBody":"Update profile image to png for jonchong98","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"3373b1e7102cabe8df475b6668901493e0606694","isMergeCommit":false,"messageTitle":"Update GitHub actions badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8b0390d037a91612808043b3bb74a5b4fa8fde65","isMergeCommit":false,"messageTitle":"Fix link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4af770da02c1e886017c0de82c4099e74395cf7d","isMergeCommit":false,"messageTitle":"Update developer guide with user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":6}}},{"hash":"50d99a60bf7c7ac785824d84d691a5dfd42bf10f","isMergeCommit":false,"messageTitle":"Add target user profile and value proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}},{"hash":"3fd894911c66df457a971b318d56a38893ba70a2","isMergeCommit":false,"messageTitle":"Update links in index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"14ac70d37ab7ea525fa3dc6c81651e3045b87d86","isMergeCommit":true,"messageTitle":"Merge pull request #50 from biinnnggggg/update-about-us","messageBody":"Update AboutUs with relevant roles and responsibilities","fileTypesAndContributionMap":{}},{"hash":"453ed3f41aa82e7738cb4c0112d6baff5fe4970c","isMergeCommit":false,"messageTitle":"Implement requested changese","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"e371bd7d99fe7cd178ead3c29d9301b9f890bd6a","isMergeCommit":true,"messageTitle":"Merge pull request #52 from Darylgolden/add-user-stories","messageBody":"Add user stories, target user profile and value proposition to Developer Guide","fileTypesAndContributionMap":{}}]}],"TopKec":[{"date":"2024-03-03","commitResults":[{"hash":"91578d659e5670ae932f8639f9b9a9c2c9d753f5","isMergeCommit":false,"messageTitle":"Update About Me for Aidan","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"eac2cca1cc440c9b570330b54b49f8b3228533b4","isMergeCommit":false,"messageTitle":"Update name of image file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"80025832fe0f17d3e87f3b315a3c29bfc35d008c","isMergeCommit":false,"messageTitle":"Update image file name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"53c99b94ea66c58f32ed722a59288d1a36ca7a50","isMergeCommit":true,"messageTitle":"Merge pull request #34 from TopKec/a-aboutUs","messageBody":"Update AboutUs for topkec","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"70d72e033614ff978a0829a35d7b1a028197e9e2","isMergeCommit":false,"messageTitle":"Add Use cases to Developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":235,"deletions":7}}},{"hash":"a199ebfb3fdf1f301e8161bc92fa71ece52d1d7f","isMergeCommit":false,"messageTitle":"Fix typo in User guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"16cb48eca58577580475e7fdf2e9290c40b5bfb4","isMergeCommit":false,"messageTitle":"Standardize placement of periods in Use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}},{"hash":"01970d808d6cb74c07566cd74309af0c8a42d94a","isMergeCommit":false,"messageTitle":"Fix some more typos in \"resume at step 2\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"dc077e1b31a5ea8e1daf9f39c6411180c90761ba","isMergeCommit":true,"messageTitle":"Merge pull request #53 from TopKec/DevGuide-UseCases","messageBody":"Add Use cases to Developer guide","fileTypesAndContributionMap":{}}]}],"biinnnggggg":[{"date":"2024-03-03","commitResults":[{"hash":"69b15ac06915469e90b7448cce8ecf1ad7598043","isMergeCommit":false,"messageTitle":"Update AboutUs for biinnngggggg","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"1d5b12259e9a93ecd64d313756b3d2504f070247","isMergeCommit":false,"messageTitle":"Rename profile picture of biinnnggggg to match github username","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b1b02c902bb468fb382009f5376700a766611ef8","isMergeCommit":true,"messageTitle":"Merge pull request #38 from biinnnggggg/branch-AboutUs","messageBody":"Update AboutUs for biinnngggggg","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"843aff2a83b594d73042f96955c0af4ffb6d7e64","isMergeCommit":true,"messageTitle":"Merge pull request #47 from Darylgolden/update-github-actions-badge","messageBody":"Update GitHub actions badge","fileTypesAndContributionMap":{}},{"hash":"a48f5d4db3c967ec6691f0daf8fda0614d15126d","isMergeCommit":false,"messageTitle":"Update AboutUs with relevant roles and responsibilities","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":11}}},{"hash":"efa00df7ee75fea9bdffa1bba32f0c9139b97387","isMergeCommit":false,"messageTitle":"Update README for `TutorRec`","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":10}}},{"hash":"caa624182477bd658b093d9d6f70c1c600071795","isMergeCommit":false,"messageTitle":"Fix README to comply with run-checks","messageBody":"Build (ubuntu-latest) failed when pull request was made. Added new line\nEOF and removed trailing whitespace to resolve this.\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"b39c5e255439bdcc74470038f94329b7eb89d57e","isMergeCommit":true,"messageTitle":"Merge pull request #54 from Darylgolden/fix-indexmd","messageBody":"Update links in index.md","fileTypesAndContributionMap":{}},{"hash":"eb35ae1880c592a401b262556203b817f623a16e","isMergeCommit":true,"messageTitle":"Merge pull request #55 from biinnnggggg/update-readme","messageBody":"Update README page for TutorRec","fileTypesAndContributionMap":{}}]}],"tanqinyong":[{"date":"2024-03-03","commitResults":[{"hash":"2c9993869ee91a7c56f1e2dd49d1d2a62eaa6417","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"Updated the page again with my github\nlink\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"d2e6cd0ccff979b98655f3e10e2e8282bd49fc96","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Darylgolden/AboutUs","messageBody":"Update AboutUs for darylgolden","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"301fbde5496d4b12d86209d691a4fcc098aaa412","isMergeCommit":false,"messageTitle":"Add more non-functional requirements for TutorRec. Update the developer guide to include more non-functional requirements.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":4}}},{"hash":"02f5088466f141909182228d080ecd3e5af3cb8b","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: Darylgolden \u003cdarylgolden@gmail.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e7e8722c8ed679b2a3258ad3f9b7e83c5a08d5f0","isMergeCommit":false,"messageTitle":"Fix minor spacing issue","messageBody":"Fixed a spacing issue on the DG for non functional requirements.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"8afa34c6d679fd5400127e85e8a9b83d167662c0","isMergeCommit":true,"messageTitle":"Merge branch \u0027add-non-functional-requirements\u0027 of https://github.com/tanqinyong/tp into add-non-functional-requirements","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"477ec2b58a329df1bf8480560d684b66f221a34b","isMergeCommit":true,"messageTitle":"Merge pull request #57 from tanqinyong/update-site-wide-settings","messageBody":"Update site-wide settings for Developer guide","fileTypesAndContributionMap":{}},{"hash":"6736719850709efb8d821ba3573df5ac6896ae29","isMergeCommit":true,"messageTitle":"Merge pull request #56 from tanqinyong/add-non-functional-requirements","messageBody":"Add more non-functional requirements for TutorRec. ","fileTypesAndContributionMap":{}}]}],"JonChong98":[{"date":"2024-03-03","commitResults":[{"hash":"4c06c592ba8f05d8a3f6f7f0e2383c11ed407818","isMergeCommit":false,"messageTitle":"Update personal details in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"f4535e5f0d1ae01f1e7a0a227bd8860c81182322","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"4f7eb3cb92e35f1996ae9f5959ea55cd0bd5700b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from JonChong98/branch-AboutUs","messageBody":"Update AboutUs for jonchong98","fileTypesAndContributionMap":{}},{"hash":"c075bb1e4805de8f463d3c0b10e61f7dbcf1fa03","isMergeCommit":false,"messageTitle":"Update profile image to png for jonchong98","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"Darylgolden":{"docs":40,"functional-code":0,"test-code":0},"TopKec":{"docs":235,"functional-code":0,"test-code":0},"biinnnggggg":{"docs":34,"functional-code":0,"test-code":0},"tanqinyong":{"docs":16,"functional-code":0,"test-code":0},"JonChong98":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Darylgolden":348.213,"TopKec":5454.248,"biinnnggggg":250.0947,"tanqinyong":43.159763,"JonChong98":12.0},"authorDisplayNameMap":{"Darylgolden":"CS2103-F09-3 DARY.. YAO","TopKec":"CS2103-F09-3 GOH ..IDAN","biinnnggggg":"CS2103-F09-3 CHIN..NING","tanqinyong":"CS2103-F09-3 TAN ..YONG","JonChong98":"CS2103-F09-3 JONA..CHYN"}} diff --git a/AY2324S2-CS2103-F15-3_tp_master/authorship.json b/AY2324S2-CS2103-F15-3_tp_master/authorship.json index 148ed9bc..c3fe5eff 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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":598,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":600,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":601,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":602,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"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":605,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":606,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":610,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":614,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":615,"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":616,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":617,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":618,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":619,"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":620,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":621,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":622,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":623,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":624,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":625,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":626,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":627,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":628,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":629,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":630,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":631,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":632,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":633,"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":634,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":635,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":636,"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":637,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":638,"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":639,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":640,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":643,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":644,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":646,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":647,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":648,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":649,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"YuvBindal":11,"ys112":47,"xinen26":229,"-":362}},{"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":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"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":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"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":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":"-"},"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":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 address book.","lastModifiedDate":"2024-02-26"},{"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":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"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 address book.","lastModifiedDate":"2024-02-26"},{"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 address book.","lastModifiedDate":"2024-02-26"},{"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 address book.","lastModifiedDate":"2024-02-26"},{"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":"ys112"},"content":"### Filtering interviewees by tag : `/filter`","lastModifiedDate":"2024-02-26"},{"lineNumber":147,"author":{"gitId":"ys112"},"content":"Filter through contact list based on what stage the interviewee is in.","lastModifiedDate":"2024-02-26"},{"lineNumber":148,"author":{"gitId":"ys112"},"content":"Format: `/filter \u003cTag\u003e`","lastModifiedDate":"2024-02-26"},{"lineNumber":149,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":150,"author":{"gitId":"ys112"},"content":"* Filters the contact list based on the `\u003cTag\u003e` provided.","lastModifiedDate":"2024-02-26"},{"lineNumber":151,"author":{"gitId":"ys112"},"content":"* Possible values for `\u003cTag\u003e` are `initial_application`, `technical_assessment`, `interview`, `decision_and_offer`.","lastModifiedDate":"2024-02-26"},{"lineNumber":152,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":153,"author":{"gitId":"ys112"},"content":"Examples:","lastModifiedDate":"2024-02-26"},{"lineNumber":154,"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":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"xinen26"},"content":"### Adding notes to interviewees by tag : `/comment`","lastModifiedDate":"2024-02-27"},{"lineNumber":157,"author":{"gitId":"xinen26"},"content":"Facilitates the addition of notes or comments to individual interviewee entries.","lastModifiedDate":"2024-02-27"},{"lineNumber":158,"author":{"gitId":"xinen26"},"content":"Format: `/comment \u003cApplicationId\u003e \u003cNote\u003e`","lastModifiedDate":"2024-02-27"},{"lineNumber":159,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":160,"author":{"gitId":"xinen26"},"content":"* Incorporate supplementary notes to enrich the interviewee\u0027s profile.","lastModifiedDate":"2024-02-27"},{"lineNumber":161,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cApplicationId\u003e` are integers.","lastModifiedDate":"2024-02-27"},{"lineNumber":162,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cNote\u003e` are any non-empty string that provides relevant commentary.","lastModifiedDate":"2024-02-27"},{"lineNumber":163,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":164,"author":{"gitId":"xinen26"},"content":"Examples:","lastModifiedDate":"2024-02-27"},{"lineNumber":165,"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":166,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":167,"author":{"gitId":"YuvBindal"},"content":"### Exporting interviewees contacts by pageId : `/export`","lastModifiedDate":"2024-03-04"},{"lineNumber":168,"author":{"gitId":"YuvBindal"},"content":"Extracts interviewees contacts into a separate address book identified by a pageId","lastModifiedDate":"2024-03-04"},{"lineNumber":169,"author":{"gitId":"YuvBindal"},"content":"Format: /export \u003cContactRange\u003e \u003cpageId\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":171,"author":{"gitId":"YuvBindal"},"content":"* Achieve an additional layer of organisation to properly arrange contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":172,"author":{"gitId":"YuvBindal"},"content":"* Possible values for `\u003cpageId\u003e` are integers.","lastModifiedDate":"2024-03-04"},{"lineNumber":173,"author":{"gitId":"YuvBindal"},"content":"* Possible values for ContactRange are two integers denoting start:end indices.","lastModifiedDate":"2024-03-04"},{"lineNumber":174,"author":{"gitId":"YuvBindal"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":175,"author":{"gitId":"YuvBindal"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":176,"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":177,"author":{"gitId":"YuvBindal"},"content":" ","lastModifiedDate":"2024-03-04"},{"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":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"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":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"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":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":196,"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":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":199,"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":200,"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":201,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"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":"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":210,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"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":213,"author":{"gitId":"ys112"},"content":"**Find** | `find Keyword [More_Keywords]`\u003cbr\u003e e.g., `find alice bob charlie`","lastModifiedDate":"2024-02-26"},{"lineNumber":214,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"ys112"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-26"},{"lineNumber":217,"author":{"gitId":"ys112"},"content":"**Filter** | `/filter \u003cTag\u003e` \u003cbr\u003e e.g., `/filter initial_application`","lastModifiedDate":"2024-02-26"},{"lineNumber":218,"author":{"gitId":"xinen26"},"content":"**Comment** | `/comment \u003cApplicationId\u003e \u003cNote\u003e` \u003cbr\u003e e.g., `/comment 10 “S/Pass Holder”`","lastModifiedDate":"2024-02-27"},{"lineNumber":219,"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":41,"xinen26":12,"-":144}},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":598,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":600,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":601,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":602,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"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":605,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":606,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":610,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":614,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":615,"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":616,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":617,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":618,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":619,"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":620,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":621,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":622,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":623,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":624,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":625,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":626,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":627,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":628,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":629,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":630,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":631,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":632,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":633,"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":634,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":635,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":636,"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":637,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":638,"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":639,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":640,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":643,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":644,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":646,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":647,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":648,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":649,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"YuvBindal":11,"ys112":47,"xinen26":229,"-":362}},{"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":"ys112"},"content":"### Filtering interviewees by tag : `/filter`","lastModifiedDate":"2024-02-26"},{"lineNumber":147,"author":{"gitId":"ys112"},"content":"Filter through contact list based on what stage the interviewee is in.","lastModifiedDate":"2024-02-26"},{"lineNumber":148,"author":{"gitId":"ys112"},"content":"Format: `/filter \u003cTag\u003e`","lastModifiedDate":"2024-02-26"},{"lineNumber":149,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":150,"author":{"gitId":"ys112"},"content":"* Filters the contact list based on the `\u003cTag\u003e` provided.","lastModifiedDate":"2024-02-26"},{"lineNumber":151,"author":{"gitId":"ys112"},"content":"* Possible values for `\u003cTag\u003e` are `initial_application`, `technical_assessment`, `interview`, `decision_and_offer`.","lastModifiedDate":"2024-02-26"},{"lineNumber":152,"author":{"gitId":"ys112"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":153,"author":{"gitId":"ys112"},"content":"Examples:","lastModifiedDate":"2024-02-26"},{"lineNumber":154,"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":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"xinen26"},"content":"### Adding notes to interviewees by tag : `/comment`","lastModifiedDate":"2024-02-27"},{"lineNumber":157,"author":{"gitId":"xinen26"},"content":"Facilitates the addition of notes or comments to individual interviewee entries.","lastModifiedDate":"2024-02-27"},{"lineNumber":158,"author":{"gitId":"xinen26"},"content":"Format: `/comment \u003cApplicationId\u003e \u003cNote\u003e`","lastModifiedDate":"2024-02-27"},{"lineNumber":159,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":160,"author":{"gitId":"xinen26"},"content":"* Incorporate supplementary notes to enrich the interviewee\u0027s profile.","lastModifiedDate":"2024-02-27"},{"lineNumber":161,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cApplicationId\u003e` are integers.","lastModifiedDate":"2024-02-27"},{"lineNumber":162,"author":{"gitId":"xinen26"},"content":"* Possible values for `\u003cNote\u003e` are any non-empty string that provides relevant commentary.","lastModifiedDate":"2024-02-27"},{"lineNumber":163,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":164,"author":{"gitId":"xinen26"},"content":"Examples:","lastModifiedDate":"2024-02-27"},{"lineNumber":165,"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":166,"author":{"gitId":"xinen26"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":167,"author":{"gitId":"YuvBindal"},"content":"### Exporting interviewees contacts by pageId : `/export`","lastModifiedDate":"2024-03-04"},{"lineNumber":168,"author":{"gitId":"ys112"},"content":"Extracts interviewees contacts into a separate HRConnect identified by a pageId","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"YuvBindal"},"content":"Format: /export \u003cContactRange\u003e \u003cpageId\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":171,"author":{"gitId":"YuvBindal"},"content":"* Achieve an additional layer of organisation to properly arrange contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":172,"author":{"gitId":"YuvBindal"},"content":"* Possible values for `\u003cpageId\u003e` are integers.","lastModifiedDate":"2024-03-04"},{"lineNumber":173,"author":{"gitId":"YuvBindal"},"content":"* Possible values for ContactRange are two integers denoting start:end indices.","lastModifiedDate":"2024-03-04"},{"lineNumber":174,"author":{"gitId":"YuvBindal"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":175,"author":{"gitId":"YuvBindal"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":176,"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":177,"author":{"gitId":"YuvBindal"},"content":" ","lastModifiedDate":"2024-03-04"},{"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":"ys112"},"content":"Clears all entries from the HRConnect.","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":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"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":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":196,"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":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":199,"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":200,"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":201,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"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":"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":210,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"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":213,"author":{"gitId":"ys112"},"content":"**Find** | `find Keyword [More_Keywords]`\u003cbr\u003e e.g., `find alice bob charlie`","lastModifiedDate":"2024-02-26"},{"lineNumber":214,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"ys112"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-26"},{"lineNumber":217,"author":{"gitId":"ys112"},"content":"**Filter** | `/filter \u003cTag\u003e` \u003cbr\u003e e.g., `/filter initial_application`","lastModifiedDate":"2024-02-26"},{"lineNumber":218,"author":{"gitId":"xinen26"},"content":"**Comment** | `/comment \u003cApplicationId\u003e \u003cNote\u003e` \u003cbr\u003e e.g., `/comment 10 “S/Pass Holder”`","lastModifiedDate":"2024-02-27"},{"lineNumber":219,"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":10,"ys112":52,"xinen26":12,"-":134}},{"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 3b7a3f4c..e7dece14 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":{}}]}],"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":[]},"authorFileTypeContributionMap":{"lihaoquan":{"docs":90,"functional-code":0,"test-code":0},"YuvBindal":{"docs":24,"functional-code":0,"test-code":0},"ys112":{"docs":88,"functional-code":0,"test-code":0},"xinen26":{"docs":241,"functional-code":0,"test-code":0},"ChrisHo1341":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"lihaoquan":5103.2065,"YuvBindal":43.171593,"ys112":1835.4677,"xinen26":9253.563,"ChrisHo1341":0.0},"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":[]},"authorFileTypeContributionMap":{"lihaoquan":{"docs":90,"functional-code":0,"test-code":0},"YuvBindal":{"docs":23,"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":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"lihaoquan":5103.2065,"YuvBindal":43.171593,"ys112":1841.1473,"xinen26":9253.563,"ChrisHo1341":0.0},"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-CS2103-F15-4_tp_master/authorship.json b/AY2324S2-CS2103-F15-4_tp_master/authorship.json index 3f5dd43f..f783a1fb 100644 --- a/AY2324S2-CS2103-F15-4_tp_master/authorship.json +++ b/AY2324S2-CS2103-F15-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"garywongkai"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml/badge.svg?branch\u003dmaster)](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"garywongkai"},"content":"- This is **Moddie!**.\u003cbr\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"garywongkai"},"content":" - as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"garywongkai"},"content":" - as a case study","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"garywongkai"},"content":"- The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":" - It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"garywongkai"},"content":" - It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"garywongkai"},"content":"- It is named `Moddie` and it is adapted from `AddressBook3`!","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"garywongkai"},"content":"- For the detailed documentation of this project, see the **[Moddie Product Website](https://ay2324s2-cs2103-f15-4.github.io/tp/index.html)**.","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"garywongkai"},"content":"- This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"garywongkai":10,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":"Together we made ````Moddie!``","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### Wong Kai Li","lastModifiedDate":"2024-02-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/garywongkai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[github](https://github.com/garywongkai)]","lastModifiedDate":"2024-02-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"garywongkai"},"content":"[[Website](https://react-site-three.vercel.app)]","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-02-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":25,"author":{"gitId":"-"},"content":"### Alvis Low Yue Han","lastModifiedDate":"2024-02-18"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":27,"author":{"gitId":"beefsausagee"},"content":"\u003cimg src\u003d\"images/alvis.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[github](https://github.com/beefsausagee)]","lastModifiedDate":"2024-02-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-18"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"### Aw Joey","lastModifiedDate":"2024-02-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"AwJoey"},"content":"\u003cimg src\u003d\"images/awjoey.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[github](https://github.com/AwJoey)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Fu Ming Jun, Dominic","lastModifiedDate":"2024-02-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"DominicFuMJ"},"content":"\u003cimg src\u003d\"images/dominic.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[github](https://github.com/DominicFuMJ)]","lastModifiedDate":"2024-02-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"### Wu Jinyan","lastModifiedDate":"2024-02-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"Morninggloryyy"},"content":"\u003cimg src\u003d\"images/Wu Jinyan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[github](https://github.com/Morninggloryyy)]","lastModifiedDate":"2024-02-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"beefsausagee":1,"Morninggloryyy":1,"DominicFuMJ":1,"AwJoey":1,"garywongkai":3,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | busy student | quickly check my friends\u0027 schedules | find a suitable time to plan a meetup. |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who likes **---** | find who has similar hobbies/interests with me | know who might want to go to a **---** related activities with me.|","lastModifiedDate":"2024-02-27"},{"lineNumber":294,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who prefers command line interface | have a GUI to include commands | add details with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":295,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student working part time | utilise Moddie to store contact details for team members, advisor | optimise my time management with school and work. |","lastModifiedDate":"2024-02-27"},{"lineNumber":296,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | student project team leader | check my teammates\u0027 schedule | conduct meetings with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":297,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | international NUS student | find local friends that share similar schedules as me to aid me in easing into the university | build meaningful connections, navigate campus life more smoothly. |","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | unmotivated student who needs to catch up on my studies|manage my timetable with my friends |easily arrange a study session with them |","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | lonely NUS Student| find contacts of people with similar interests as myself| get to know them better and make friends.|","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS graduate|find my lecturer’s contact email and phone number | ask them to be a reference in my resume when applying for a job.|","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS Student| save my friends’ interests in the contact book| plan outings with them.|","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |busy NUS student | easily add my schedule to Moddie|efficiently manage my academic, extracurricular, and personal commitments in one centralized platform.|","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| delete both my friends\u0027 and my own schedule details| maintain privacy and control over the information|","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| view my friends\u0027 and their schedule details |easily coordinate plans, schedule meetings |","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who gets confused with commands| have an interface to assist me|know what commands I can use |","lastModifiedDate":"2024-02-28"},{"lineNumber":306,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student | exit the interface|properly close the application |","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student|clear my commands |clear command messages that I do not need anymore |","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS graduate| save the contacts of my Lecturer and Tutor| stay in touch with them after graduation.|","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS student who makes errors|have an interface to prompt me | prevent myself from typing the wrong command.|","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who wants to join extracurricular activities |have a place to store my CCA events |easily make time for them. |","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who would like timetable suggestions|see other people\u0027s schedules to see who is taking the same modules as me |see what other modules they are also planning to take in the semester. |","lastModifiedDate":"2024-02-28"},{"lineNumber":312,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student pursuing an internship | coordinate networking events and informational interviews with local professionals and industry experts|expand my professional network and efficiently manage my academic commitments. |","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"beefsausagee"},"content":"| `* *` | course coordinator at NUS|communicate announcements, updates, and assignment deadlines to my students | provide a convenient channel for information dissemination and student engagement.|","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"beefsausagee"},"content":"| `* *` |Lecturer | arrange the contacts of the TAs using a module tag| send the correct instructions for the module.|","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student |edit my schedule, in case of any changes | ensure that my calendar remains accurate and reflective of my current commitments and availability.|","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"beefsausagee"},"content":"| `*` |NUS Student | see the schedule and interest of my classmates to know who would share the same interest as me|meet them for outings/lunch. |","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"beefsausagee"},"content":"| `*` | project leader|have an interface to see the timetable of my group mates | synchronise meetings best fitted for everyone’s schedule.|","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"beefsausagee"},"content":"| `*` | international student| know my groupmates’ schedules to better arrange my flights (to avoid missing any meeting)| successfully accommodate my travel plans.|","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"beefsausagee"},"content":"| `*` |introverted NUS student|arrange meetings with my new groupmates without interacting with them| comfortably initiate group collaboration and fulfil project requirements.|","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"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":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"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":353,"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":354,"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":355,"author":{"gitId":"garywongkai"},"content":"4. A user can have less than 6 modules in their timetable at a given time.","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"garywongkai"},"content":"5. A user can view 5 other students at one go in the schedule view.","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":363,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"garywongkai"},"content":"* **Module**: A slot in the day used for lesson","lastModifiedDate":"2024-02-28"},{"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":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":373,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"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/box\u003e","lastModifiedDate":"2023-09-12"},{"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":{"beefsausagee":28,"garywongkai":3,"-":387}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":76,"author":{"gitId":"DominicFuMJ"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":78,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":80,"author":{"gitId":"DominicFuMJ"},"content":"Help not available. Please try again.","lastModifiedDate":"2024-02-29"},{"lineNumber":81,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"AwJoey"},"content":"Adds a person to the address book with their information.","lastModifiedDate":"2024-02-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"AwJoey"},"content":"* Phone number **must be a valid Singapore number** (i.e. 8 digits, starts with either 6, 8 or 9)","lastModifiedDate":"2024-02-29"},{"lineNumber":90,"author":{"gitId":"AwJoey"},"content":"* Email **must include @ character**","lastModifiedDate":"2024-02-29"},{"lineNumber":91,"author":{"gitId":"AwJoey"},"content":"* Address **must include and be ordered in street name, block number, and unit number (note: include # symbol)**, ","lastModifiedDate":"2024-02-29"},{"lineNumber":92,"author":{"gitId":"AwJoey"},"content":"separated with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":93,"author":{"gitId":"AwJoey"},"content":"* If multiple `tag` are added, separate with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":95,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":102,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":103,"author":{"gitId":"AwJoey"},"content":"New contact added!","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":112,"author":{"gitId":"AwJoey"},"content":"* Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"AwJoey"},"content":"* Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"AwJoey"},"content":"* Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"AwJoey"},"content":"List of contacts:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":128,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":129,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":131,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"AwJoey"},"content":"No contacts added yet.","lastModifiedDate":"2024-02-29"},{"lineNumber":133,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":134,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":135,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"AwJoey"},"content":"Edits an existing person\u0027s information in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"AwJoey"},"content":"* Adding a person\u0027s format for **phone number, email, and address** applies here as well.","lastModifiedDate":"2024-02-29"},{"lineNumber":149,"author":{"gitId":"AwJoey"},"content":"* ","lastModifiedDate":"2024-02-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":165,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":166,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":167,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":168,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":169,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":170,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":172,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":"### Locating persons by name : `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":195,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":196,"author":{"gitId":"AwJoey"},"content":"Contacts found:","lastModifiedDate":"2024-02-29"},{"lineNumber":197,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":198,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":199,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":200,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":201,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":202,"author":{"gitId":"AwJoey"},"content":"No contact found.","lastModifiedDate":"2024-02-29"},{"lineNumber":203,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":204,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":205,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":221,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":222,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":223,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":224,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":225,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":226,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":227,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":228,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":229,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":230,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":231,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":232,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":233,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":234,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome: ","lastModifiedDate":"2024-02-29"},{"lineNumber":242,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":243,"author":{"gitId":"DominicFuMJ"},"content":"History cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":244,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":245,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":246,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":247,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":248,"author":{"gitId":"DominicFuMJ"},"content":"History not cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":249,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":250,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":251,"author":{"gitId":"DominicFuMJ"},"content":"### Adding interest tag : `interest`","lastModifiedDate":"2024-02-29"},{"lineNumber":252,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":253,"author":{"gitId":"DominicFuMJ"},"content":"Adding an interest tag to a specified person from the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":254,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":255,"author":{"gitId":"DominicFuMJ"},"content":"Format: `interest INDEX INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":256,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":257,"author":{"gitId":"DominicFuMJ"},"content":"* Adds an interest to the person at the specified \u0027INDEX\u0027","lastModifiedDate":"2024-02-29"},{"lineNumber":258,"author":{"gitId":"DominicFuMJ"},"content":"* The index refers to the index number shown in the displayed person list","lastModifiedDate":"2024-02-29"},{"lineNumber":259,"author":{"gitId":"DominicFuMJ"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":260,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":261,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":262,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":263,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 3 swimming` adds the interest tag `swimming` to the 3rd person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":264,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 1 cooking cycling` adds the interest tags `cooking` and `cycling` to the 1st person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":265,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"DominicFuMJ"},"content":"Tagged on contact 1","lastModifiedDate":"2024-02-29"},{"lineNumber":269,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":270,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":271,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":272,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":273,"author":{"gitId":"DominicFuMJ"},"content":"Contact not available","lastModifiedDate":"2024-02-29"},{"lineNumber":274,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":275,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":276,"author":{"gitId":"DominicFuMJ"},"content":"### Locating persons by interest : `findInterest`","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":278,"author":{"gitId":"DominicFuMJ"},"content":"Find persons whose interest tag contains any of the given keywords","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":280,"author":{"gitId":"DominicFuMJ"},"content":"Format: `findInterest INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"DominicFuMJ"},"content":"* The search is case-insensitive. e.g. `cooking` will match `Cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"DominicFuMJ"},"content":"* The order of the keywords does not matter. e.g. `cycling bikes` will match `bikes cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"DominicFuMJ"},"content":"* Only the interest tag is searched","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"DominicFuMJ"},"content":"* Only full words will be matched e.g. `Cycle` will not match `Cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"DominicFuMJ"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search)","lastModifiedDate":"2024-02-29"},{"lineNumber":287,"author":{"gitId":"DominicFuMJ"},"content":" e.g. `Ice Skating` will return `Ice Sculpting`, `Rollor Skating`","lastModifiedDate":"2024-02-29"},{"lineNumber":288,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":289,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":290,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":291,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest swimming` returns `Joseph Schooling` and `Joscelin Yeo Wei Ling` with tags for `swimming`","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest cooking cycling` returns `Lance Armstrong` for `cycling`, `Andre Chiang` for `cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"DominicFuMJ"},"content":"Interests found:","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"DominicFuMJ"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":298,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":299,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":302,"author":{"gitId":"DominicFuMJ"},"content":"Interests not found","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"DominicFuMJ"},"content":"### Adding persons to schedule : `addSched`","lastModifiedDate":"2024-02-29"},{"lineNumber":306,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":307,"author":{"gitId":"DominicFuMJ"},"content":"Adds an event with contact from specified date with time","lastModifiedDate":"2024-02-29"},{"lineNumber":308,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":309,"author":{"gitId":"DominicFuMJ"},"content":"Format: `addSched INDEX [MORE_INDEX] SCHEDULE_NAME from/DATE_TIME to/TIME`","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"DominicFuMJ"},"content":"* The INDEX **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"DominicFuMJ"},"content":"* The SCHEDULE_NAME **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"DominicFuMJ"},"content":"* The DATE_TIME must be in the format of ddmmyyyy HHmm in 24-hour time","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"DominicFuMJ"},"content":"* The TIME must be in the format of HHmm, but **not before the time from DATE_TIME** e.g. 0000-2359","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"AwJoey"},"content":"* `find Betsy` followed by `addSched 1 Exam 05032024 1600 1800` adds the 1st person in ","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"AwJoey"},"content":"the results of the `find` command to the event stated.","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 4 Exam 05032024 1600 1800` will add the 4th person in the address list to the `Exam` event which ","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"DominicFuMJ"},"content":"would take place on 5th March 2024 from 4pm - 6pm","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 1,2,3 CSMeeting 18032024 1500 1900` will add the 1st, 2nd and 3rd persons in the address list ","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"DominicFuMJ"},"content":"to the `CSMeeting` event which would take place on 18th March 2024 from 3pm - 7pm","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":324,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":325,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":326,"author":{"gitId":"DominicFuMJ"},"content":"Added schedule with ...","lastModifiedDate":"2024-02-29"},{"lineNumber":327,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"DominicFuMJ"},"content":"Schedule failed to be added.","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"DominicFuMJ"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"DominicFuMJ"},"content":"* Time format is wrong!","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"DominicFuMJ"},"content":"* Date format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"DominicFuMJ"},"content":"* Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":351,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":353,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":356,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":357,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":358,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":377,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":379,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":383,"author":{"gitId":"AwJoey"},"content":"**Help** | `help`","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"AwJoey"},"content":"**List** | `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"AwJoey"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"AwJoey"},"content":"**Clear** | `clear`","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"DominicFuMJ"},"content":"**Interest Tagging** | `interest INDEX INTEREST [MORE_INTERESTS]` \u003cbr\u003e e.g. `interest 3 swimming cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"DominicFuMJ"},"content":"**Find Interest** | `findInterest INTEREST [MORE_INTEREST]` \u003cbr\u003e e.g. `findInterest cooking music`","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"DominicFuMJ"},"content":"**Add Schedule** | `addSched INDEX [MORE_INDEX] SCHEDULE_NAME` \u003cbr\u003e e.g. `addSched 1,2,3 CSMeeting 18032024 1500 1900`","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"DominicFuMJ"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"DominicFuMJ":107,"AwJoey":92,"-":194}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"garywongkai"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml/badge.svg?branch\u003dmaster)](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"garywongkai"},"content":"- This is **Moddie!**.\u003cbr\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"garywongkai"},"content":" - as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"garywongkai"},"content":" - as a case study","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"garywongkai"},"content":"- The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":" - It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"garywongkai"},"content":" - It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"garywongkai"},"content":"- It is named `Moddie` and it is adapted from `AddressBook3`!","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"garywongkai"},"content":"- For the detailed documentation of this project, see the **[Moddie Product Website](https://ay2324s2-cs2103-f15-4.github.io/tp/index.html)**.","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"garywongkai"},"content":"- This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"garywongkai":10,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":"Together we made ````Moddie!``","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### Wong Kai Li","lastModifiedDate":"2024-02-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/garywongkai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[github](https://github.com/garywongkai)]","lastModifiedDate":"2024-02-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"garywongkai"},"content":"[[Website](https://react-site-three.vercel.app)]","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-02-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":25,"author":{"gitId":"-"},"content":"### Alvis Low Yue Han","lastModifiedDate":"2024-02-18"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":27,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/alvislow.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[github](https://github.com/beefsausagee)]","lastModifiedDate":"2024-02-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-18"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"### Aw Joey","lastModifiedDate":"2024-02-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"AwJoey"},"content":"\u003cimg src\u003d\"images/awjoey.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[github](https://github.com/AwJoey)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Fu Ming Jun, Dominic","lastModifiedDate":"2024-02-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/dominicfumj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[github](https://github.com/DominicFuMJ)]","lastModifiedDate":"2024-02-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"### Wu Jinyan","lastModifiedDate":"2024-02-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/morninggloryyy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[github](https://github.com/Morninggloryyy)]","lastModifiedDate":"2024-02-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AwJoey":1,"garywongkai":6,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"garywongkai"},"content":"* uses application to track schedule of contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"garywongkai"},"content":"* prefer a simple UI","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":294,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | busy student | quickly check my friends\u0027 schedules | find a suitable time to plan a meetup. |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who likes **---** | find who has similar hobbies/interests with me | know who might want to go to a **---** related activities with me.|","lastModifiedDate":"2024-02-27"},{"lineNumber":296,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who prefers command line interface | have a GUI to include commands | add details with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":297,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student working part time | utilise Moddie to store contact details for team members, advisor | optimise my time management with school and work. |","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | student project team leader | check my teammates\u0027 schedule | conduct meetings with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | international NUS student | find local friends that share similar schedules as me to aid me in easing into the university | build meaningful connections, navigate campus life more smoothly. |","lastModifiedDate":"2024-02-27"},{"lineNumber":300,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | unmotivated student who needs to catch up on my studies|manage my timetable with my friends |easily arrange a study session with them |","lastModifiedDate":"2024-02-27"},{"lineNumber":301,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | lonely NUS Student| find contacts of people with similar interests as myself| get to know them better and make friends.|","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS graduate|find my lecturer’s contact email and phone number | ask them to be a reference in my resume when applying for a job.|","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS Student| save my friends’ interests in the contact book| plan outings with them.|","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |busy NUS student | easily add my schedule to Moddie|efficiently manage my academic, extracurricular, and personal commitments in one centralized platform.|","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| delete both my friends\u0027 and my own schedule details| maintain privacy and control over the information|","lastModifiedDate":"2024-02-28"},{"lineNumber":306,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| view my friends\u0027 and their schedule details |easily coordinate plans, schedule meetings |","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who gets confused with commands| have an interface to assist me|know what commands I can use |","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student | exit the interface|properly close the application |","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student|clear my commands |clear command messages that I do not need anymore |","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS graduate| save the contacts of my Lecturer and Tutor| stay in touch with them after graduation.|","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS student who makes errors|have an interface to prompt me | prevent myself from typing the wrong command.|","lastModifiedDate":"2024-02-28"},{"lineNumber":312,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who wants to join extracurricular activities |have a place to store my CCA events |easily make time for them. |","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who would like timetable suggestions|see other people\u0027s schedules to see who is taking the same modules as me |see what other modules they are also planning to take in the semester. |","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student pursuing an internship | coordinate networking events and informational interviews with local professionals and industry experts|expand my professional network and efficiently manage my academic commitments. |","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"beefsausagee"},"content":"| `* *` | course coordinator at NUS|communicate announcements, updates, and assignment deadlines to my students | provide a convenient channel for information dissemination and student engagement.|","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"beefsausagee"},"content":"| `* *` |Lecturer | arrange the contacts of the TAs using a module tag| send the correct instructions for the module.|","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student |edit my schedule, in case of any changes | ensure that my calendar remains accurate and reflective of my current commitments and availability.|","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"beefsausagee"},"content":"| `*` |NUS Student | see the schedule and interest of my classmates to know who would share the same interest as me|meet them for outings/lunch. |","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"beefsausagee"},"content":"| `*` | project leader|have an interface to see the timetable of my group mates | synchronise meetings best fitted for everyone’s schedule.|","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"beefsausagee"},"content":"| `*` | international student| know my groupmates’ schedules to better arrange my flights (to avoid missing any meeting)| successfully accommodate my travel plans.|","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"beefsausagee"},"content":"| `*` |introverted NUS student|arrange meetings with my new groupmates without interacting with them| comfortably initiate group collaboration and fulfil project requirements.|","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"garywongkai"},"content":"(For all use cases below, the **System** is the `Moddie` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"garywongkai"},"content":"4. A user can have less than 6 modules in their timetable at a given time.","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"garywongkai"},"content":"5. A user can view 5 other students at one go in the schedule view.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":365,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"garywongkai"},"content":"* **Module**: A slot in the day used for lesson","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":375,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":376,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"beefsausagee":28,"garywongkai":6,"-":386}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":76,"author":{"gitId":"DominicFuMJ"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":78,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":80,"author":{"gitId":"DominicFuMJ"},"content":"Help not available. Please try again.","lastModifiedDate":"2024-02-29"},{"lineNumber":81,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"AwJoey"},"content":"Adds a person to the address book with their information.","lastModifiedDate":"2024-02-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"AwJoey"},"content":"* Phone number **must be a valid Singapore number** (i.e. 8 digits, starts with either 6, 8 or 9)","lastModifiedDate":"2024-02-29"},{"lineNumber":90,"author":{"gitId":"AwJoey"},"content":"* Email **must include @ character**","lastModifiedDate":"2024-02-29"},{"lineNumber":91,"author":{"gitId":"AwJoey"},"content":"* Address **must include and be ordered in street name, block number, and unit number (note: include # symbol)**, ","lastModifiedDate":"2024-02-29"},{"lineNumber":92,"author":{"gitId":"AwJoey"},"content":"separated with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":93,"author":{"gitId":"AwJoey"},"content":"* If multiple `tag` are added, separate with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":95,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":102,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":103,"author":{"gitId":"AwJoey"},"content":"New contact added!","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":112,"author":{"gitId":"AwJoey"},"content":"* Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"AwJoey"},"content":"* Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"AwJoey"},"content":"* Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"AwJoey"},"content":"List of contacts:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":128,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":129,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":131,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"AwJoey"},"content":"No contacts added yet.","lastModifiedDate":"2024-02-29"},{"lineNumber":133,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":134,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":135,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"AwJoey"},"content":"Edits an existing person\u0027s information in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"AwJoey"},"content":"* Adding a person\u0027s format for **phone number, email, and address** applies here as well.","lastModifiedDate":"2024-02-29"},{"lineNumber":149,"author":{"gitId":"AwJoey"},"content":"* ","lastModifiedDate":"2024-02-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":165,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":166,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":167,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":168,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":169,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":170,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":172,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":"### Locating persons by name : `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":195,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":196,"author":{"gitId":"AwJoey"},"content":"Contacts found:","lastModifiedDate":"2024-02-29"},{"lineNumber":197,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":198,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":199,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":200,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":201,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":202,"author":{"gitId":"AwJoey"},"content":"No contact found.","lastModifiedDate":"2024-02-29"},{"lineNumber":203,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":204,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":205,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":221,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":222,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":223,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":224,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":225,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":226,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":227,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":228,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":229,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":230,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":231,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":232,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":233,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":234,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome: ","lastModifiedDate":"2024-02-29"},{"lineNumber":242,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":243,"author":{"gitId":"DominicFuMJ"},"content":"History cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":244,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":245,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":246,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":247,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":248,"author":{"gitId":"DominicFuMJ"},"content":"History not cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":249,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":250,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":251,"author":{"gitId":"DominicFuMJ"},"content":"### Adding interest tag : `interest`","lastModifiedDate":"2024-02-29"},{"lineNumber":252,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":253,"author":{"gitId":"DominicFuMJ"},"content":"Adding an interest tag to a specified person from the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":254,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":255,"author":{"gitId":"DominicFuMJ"},"content":"Format: `interest INDEX INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":256,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":257,"author":{"gitId":"DominicFuMJ"},"content":"* Adds an interest to the person at the specified \u0027INDEX\u0027","lastModifiedDate":"2024-02-29"},{"lineNumber":258,"author":{"gitId":"DominicFuMJ"},"content":"* The index refers to the index number shown in the displayed person list","lastModifiedDate":"2024-02-29"},{"lineNumber":259,"author":{"gitId":"DominicFuMJ"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":260,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":261,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":262,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":263,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 3 swimming` adds the interest tag `swimming` to the 3rd person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":264,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 1 cooking cycling` adds the interest tags `cooking` and `cycling` to the 1st person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":265,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"DominicFuMJ"},"content":"Tagged on contact 1","lastModifiedDate":"2024-02-29"},{"lineNumber":269,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":270,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":271,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":272,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":273,"author":{"gitId":"DominicFuMJ"},"content":"Contact not available","lastModifiedDate":"2024-02-29"},{"lineNumber":274,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":275,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":276,"author":{"gitId":"DominicFuMJ"},"content":"### Locating persons by interest : `findInterest`","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":278,"author":{"gitId":"DominicFuMJ"},"content":"Find persons whose interest tag contains any of the given keywords","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":280,"author":{"gitId":"DominicFuMJ"},"content":"Format: `findInterest INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"DominicFuMJ"},"content":"* The search is case-insensitive. e.g. `cooking` will match `Cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"DominicFuMJ"},"content":"* The order of the keywords does not matter. e.g. `cycling bikes` will match `bikes cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"DominicFuMJ"},"content":"* Only the interest tag is searched","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"DominicFuMJ"},"content":"* Only full words will be matched e.g. `Cycle` will not match `Cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"DominicFuMJ"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search)","lastModifiedDate":"2024-02-29"},{"lineNumber":287,"author":{"gitId":"DominicFuMJ"},"content":" e.g. `Ice Skating` will return `Ice Sculpting`, `Rollor Skating`","lastModifiedDate":"2024-02-29"},{"lineNumber":288,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":289,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":290,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":291,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest swimming` returns `Joseph Schooling` and `Joscelin Yeo Wei Ling` with tags for `swimming`","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest cooking cycling` returns `Lance Armstrong` for `cycling`, `Andre Chiang` for `cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"DominicFuMJ"},"content":"Interests found:","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"DominicFuMJ"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":298,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":299,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":302,"author":{"gitId":"DominicFuMJ"},"content":"Interests not found","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"DominicFuMJ"},"content":"### Adding persons to schedule : `addSched`","lastModifiedDate":"2024-02-29"},{"lineNumber":306,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":307,"author":{"gitId":"DominicFuMJ"},"content":"Adds an event with contact from specified date with time","lastModifiedDate":"2024-02-29"},{"lineNumber":308,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":309,"author":{"gitId":"DominicFuMJ"},"content":"Format: `addSched INDEX [MORE_INDEX] SCHEDULE_NAME from/DATE_TIME to/TIME`","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"DominicFuMJ"},"content":"* The INDEX **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"DominicFuMJ"},"content":"* The SCHEDULE_NAME **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"DominicFuMJ"},"content":"* The DATE_TIME must be in the format of ddmmyyyy HHmm in 24-hour time","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"DominicFuMJ"},"content":"* The TIME must be in the format of HHmm, but **not before the time from DATE_TIME** e.g. 0000-2359","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"AwJoey"},"content":"* `find Betsy` followed by `addSched 1 Exam 05032024 1600 1800` adds the 1st person in ","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"AwJoey"},"content":"the results of the `find` command to the event stated.","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 4 Exam 05032024 1600 1800` will add the 4th person in the address list to the `Exam` event which ","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"DominicFuMJ"},"content":"would take place on 5th March 2024 from 4pm - 6pm","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 1,2,3 CSMeeting 18032024 1500 1900` will add the 1st, 2nd and 3rd persons in the address list ","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"DominicFuMJ"},"content":"to the `CSMeeting` event which would take place on 18th March 2024 from 3pm - 7pm","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":324,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":325,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":326,"author":{"gitId":"DominicFuMJ"},"content":"Added schedule with ...","lastModifiedDate":"2024-02-29"},{"lineNumber":327,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"DominicFuMJ"},"content":"Schedule failed to be added.","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"DominicFuMJ"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"DominicFuMJ"},"content":"* Time format is wrong!","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"DominicFuMJ"},"content":"* Date format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"DominicFuMJ"},"content":"* Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":351,"author":{"gitId":"-"},"content":"AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2023-09-08"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":353,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":356,"author":{"gitId":"-"},"content":"If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":357,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":358,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.","lastModifiedDate":"2023-09-08"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":377,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":379,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":383,"author":{"gitId":"AwJoey"},"content":"**Help** | `help`","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"AwJoey"},"content":"**List** | `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"AwJoey"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"AwJoey"},"content":"**Clear** | `clear`","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"DominicFuMJ"},"content":"**Interest Tagging** | `interest INDEX INTEREST [MORE_INTERESTS]` \u003cbr\u003e e.g. `interest 3 swimming cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"DominicFuMJ"},"content":"**Find Interest** | `findInterest INTEREST [MORE_INTEREST]` \u003cbr\u003e e.g. `findInterest cooking music`","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"DominicFuMJ"},"content":"**Add Schedule** | `addSched INDEX [MORE_INDEX] SCHEDULE_NAME` \u003cbr\u003e e.g. `addSched 1,2,3 CSMeeting 18032024 1500 1900`","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"DominicFuMJ"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"DominicFuMJ":107,"AwJoey":92,"-":194}}] diff --git a/AY2324S2-CS2103-F15-4_tp_master/commits.json b/AY2324S2-CS2103-F15-4_tp_master/commits.json index d83de741..95d8fb4d 100644 --- a/AY2324S2-CS2103-F15-4_tp_master/commits.json +++ b/AY2324S2-CS2103-F15-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"beefsausagee":[{"date":"2024-02-27","commitResults":[{"hash":"1a850110f8e3334ded13fac55d0bd42c1b30b957","isMergeCommit":false,"messageTitle":"Add photo to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a98e39eab1133877c17f3d38e9efde0589231c7a","isMergeCommit":true,"messageTitle":"Merge pull request #12 from beefsausagee/branch-Alvis","messageBody":"Add photo to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"2a777ec58241cda576d1040a36e4cbc07ad327f9","isMergeCommit":false,"messageTitle":"Add User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":7}}}]},{"date":"2024-02-28","commitResults":[{"hash":"f0ec4a79285aa4320e19bd0f231faad2ebc28c43","isMergeCommit":false,"messageTitle":"Add more user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":5}}},{"hash":"49a5fb1e4b443d96904a0d5ae586d441992c142a","isMergeCommit":false,"messageTitle":"Implement changes for grammar on DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":6}}},{"hash":"8e86a41b8e7c266f3846a26d95b8291c5acd4b71","isMergeCommit":false,"messageTitle":"Implement changes to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":12}}}]}],"Morninggloryyy":[{"date":"2024-02-27","commitResults":[{"hash":"d08116fb52e8001c4533d000081459a9d672c24a","isMergeCommit":false,"messageTitle":"Add photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bf6fe7826d7acb044fb6cd7651a405db8f7241aa","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Morninggloryyy/branch-Jinyan","messageBody":"Add photo","fileTypesAndContributionMap":{}}]}],"DominicFuMJ":[{"date":"2024-02-27","commitResults":[{"hash":"5ccc48193fdea99fcc2b2ed6f8fce0f220133268","isMergeCommit":false,"messageTitle":"Add image for Dominic and update the photo in the AboutUs.md","messageBody":"I added my image to the docs/images folder and updated the photo used in the AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f734d27ce5a6b33ee4852df656749f8ec390d9fe","isMergeCommit":true,"messageTitle":"Merge pull request #11 from DominicFuMJ/branch-dominic-about-us","messageBody":"Add image for Dominic and update the photo in the AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"0a5ed4c8cbfde7ce2dbf914deb75d568b19045e0","isMergeCommit":false,"messageTitle":"Added the user guide features for clear, help, exit, interest tagging, find similar interest and schedule adding.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":108,"deletions":3}}},{"hash":"6a8e4678560523c3d00c3ba75ec0a4e874d4b5c4","isMergeCommit":true,"messageTitle":"Merge pull request #15 from beefsausagee/branch-Alvis","messageBody":"Add User Stories to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f24605fab486f008a009defc110fd47dca931b82","isMergeCommit":true,"messageTitle":"Merge pull request #16 from garywongkai/Issue7-DeveloperGuide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"AwJoey":[{"date":"2024-02-27","commitResults":[{"hash":"488861800fdde90b6b8f0d7b1eaea23af14c25ad","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ff3cea7bda00bfc4891d8358470657727584c51c","isMergeCommit":false,"messageTitle":"Revert \"Update AboutUs.md: add awjoey.jpg and update photo\"","messageBody":"This reverts commit 488861800fdde90b6b8f0d7b1eaea23af14c25ad.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"44227f9e48f07ca3172584355a713c4d56986b4b","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"f62a3e8ed41618789fde622092a1d2433441956f","isMergeCommit":true,"messageTitle":"Merge pull request #17 from DominicFuMJ/branch-dominic-UserGuide","messageBody":"Added the user guide features for clear, help, exit, interest tagging…","fileTypesAndContributionMap":{}},{"hash":"217d2e3f1be9d2a47ba2c41f54479c1fcb67182e","isMergeCommit":false,"messageTitle":"Edit UserGuide Add, List, Edit, Find, Delete, addSched commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":90,"deletions":8}}},{"hash":"b0f9deebb7dedc69feb321c20bb358b1cd307576","isMergeCommit":false,"messageTitle":"Edit UserGuide\u0027s addSched command to include previous find cmd behavior","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]}],"garywongkai":[{"date":"2024-02-26","commitResults":[{"hash":"d74e2c8c57fd393ed48f7626cc8553a9ed1854b6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"b9d8884efeab6b784f5118ddf88ef55a32c9e0b9","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}}]},{"date":"2024-02-27","commitResults":[{"hash":"2c5d7dab98daa9607e6f96b1ae7e7478ad82356f","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"92e5e7c7f38e27a95c6281b4a415fae1edcabfc3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":11}}},{"hash":"2eacf54868e619203de3208c271048054695477f","isMergeCommit":true,"messageTitle":"Merge pull request #14 from AY2324S2-CS2103-F15-4/branch-awjoey-aboutus","messageBody":"Update AboutUs.md: add awjoey.jpg and update photo","fileTypesAndContributionMap":{}},{"hash":"99f1230cfb1c781ecebe9a1beb7439491bee77d4","isMergeCommit":true,"messageTitle":"Merge pull request #8 from garywongkai/US1-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"df3ff2fbd3fcabca3f64b07957ec92f1113d18a2","isMergeCommit":true,"messageTitle":"Merge pull request #9 from garywongkai/Issue5-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"9eb69cd00f3a047dc6d0b2d8de7a14e956c3bf0d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"145cc54e5b0382e8cbbcfe8e934d76d6d507effb","isMergeCommit":true,"messageTitle":"Merge pull request #18 from AwJoey/master","messageBody":"Edit user guide for add, edit, list, delete, addSched commands","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"beefsausagee":{"docs":29,"functional-code":0,"test-code":0},"Morninggloryyy":{"docs":1,"functional-code":0,"test-code":0},"DominicFuMJ":{"docs":108,"functional-code":0,"test-code":0},"AwJoey":{"docs":93,"functional-code":0,"test-code":0},"garywongkai":{"docs":16,"functional-code":0,"test-code":0}},"authorContributionVariance":{"beefsausagee":415.1875,"Morninggloryyy":0.4375,"DominicFuMJ":1341.1094,"AwJoey":1078.9375,"garywongkai":66.359375},"authorDisplayNameMap":{"beefsausagee":"CS2103-F15-4 ALVI.. HAN","Morninggloryyy":"CS2103-F15-4 WU J..NYAN","DominicFuMJ":"CS2103-F15-4 FU M..INIC","AwJoey":"CS2103-F15-4 AW J..JOEY","garywongkai":"CS2103-F15-4 WONG..I LI"}} +{"authorDailyContributionsMap":{"beefsausagee":[{"date":"2024-02-27","commitResults":[{"hash":"1a850110f8e3334ded13fac55d0bd42c1b30b957","isMergeCommit":false,"messageTitle":"Add photo to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a98e39eab1133877c17f3d38e9efde0589231c7a","isMergeCommit":true,"messageTitle":"Merge pull request #12 from beefsausagee/branch-Alvis","messageBody":"Add photo to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"2a777ec58241cda576d1040a36e4cbc07ad327f9","isMergeCommit":false,"messageTitle":"Add User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":7}}}]},{"date":"2024-02-28","commitResults":[{"hash":"f0ec4a79285aa4320e19bd0f231faad2ebc28c43","isMergeCommit":false,"messageTitle":"Add more user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":5}}},{"hash":"49a5fb1e4b443d96904a0d5ae586d441992c142a","isMergeCommit":false,"messageTitle":"Implement changes for grammar on DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":6}}},{"hash":"8e86a41b8e7c266f3846a26d95b8291c5acd4b71","isMergeCommit":false,"messageTitle":"Implement changes to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":12}}}]}],"Morninggloryyy":[{"date":"2024-02-27","commitResults":[{"hash":"d08116fb52e8001c4533d000081459a9d672c24a","isMergeCommit":false,"messageTitle":"Add photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bf6fe7826d7acb044fb6cd7651a405db8f7241aa","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Morninggloryyy/branch-Jinyan","messageBody":"Add photo","fileTypesAndContributionMap":{}}]}],"DominicFuMJ":[{"date":"2024-02-27","commitResults":[{"hash":"5ccc48193fdea99fcc2b2ed6f8fce0f220133268","isMergeCommit":false,"messageTitle":"Add image for Dominic and update the photo in the AboutUs.md","messageBody":"I added my image to the docs/images folder and updated the photo used in the AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f734d27ce5a6b33ee4852df656749f8ec390d9fe","isMergeCommit":true,"messageTitle":"Merge pull request #11 from DominicFuMJ/branch-dominic-about-us","messageBody":"Add image for Dominic and update the photo in the AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"0a5ed4c8cbfde7ce2dbf914deb75d568b19045e0","isMergeCommit":false,"messageTitle":"Added the user guide features for clear, help, exit, interest tagging, find similar interest and schedule adding.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":108,"deletions":3}}},{"hash":"6a8e4678560523c3d00c3ba75ec0a4e874d4b5c4","isMergeCommit":true,"messageTitle":"Merge pull request #15 from beefsausagee/branch-Alvis","messageBody":"Add User Stories to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f24605fab486f008a009defc110fd47dca931b82","isMergeCommit":true,"messageTitle":"Merge pull request #16 from garywongkai/Issue7-DeveloperGuide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"AwJoey":[{"date":"2024-02-27","commitResults":[{"hash":"488861800fdde90b6b8f0d7b1eaea23af14c25ad","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ff3cea7bda00bfc4891d8358470657727584c51c","isMergeCommit":false,"messageTitle":"Revert \"Update AboutUs.md: add awjoey.jpg and update photo\"","messageBody":"This reverts commit 488861800fdde90b6b8f0d7b1eaea23af14c25ad.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"44227f9e48f07ca3172584355a713c4d56986b4b","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"f62a3e8ed41618789fde622092a1d2433441956f","isMergeCommit":true,"messageTitle":"Merge pull request #17 from DominicFuMJ/branch-dominic-UserGuide","messageBody":"Added the user guide features for clear, help, exit, interest tagging…","fileTypesAndContributionMap":{}},{"hash":"217d2e3f1be9d2a47ba2c41f54479c1fcb67182e","isMergeCommit":false,"messageTitle":"Edit UserGuide Add, List, Edit, Find, Delete, addSched commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":90,"deletions":8}}},{"hash":"b0f9deebb7dedc69feb321c20bb358b1cd307576","isMergeCommit":false,"messageTitle":"Edit UserGuide\u0027s addSched command to include previous find cmd behavior","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]}],"garywongkai":[{"date":"2024-02-26","commitResults":[{"hash":"d74e2c8c57fd393ed48f7626cc8553a9ed1854b6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"b9d8884efeab6b784f5118ddf88ef55a32c9e0b9","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}}]},{"date":"2024-02-27","commitResults":[{"hash":"2c5d7dab98daa9607e6f96b1ae7e7478ad82356f","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"92e5e7c7f38e27a95c6281b4a415fae1edcabfc3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":11}}},{"hash":"2eacf54868e619203de3208c271048054695477f","isMergeCommit":true,"messageTitle":"Merge pull request #14 from AY2324S2-CS2103-F15-4/branch-awjoey-aboutus","messageBody":"Update AboutUs.md: add awjoey.jpg and update photo","fileTypesAndContributionMap":{}},{"hash":"99f1230cfb1c781ecebe9a1beb7439491bee77d4","isMergeCommit":true,"messageTitle":"Merge pull request #8 from garywongkai/US1-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"df3ff2fbd3fcabca3f64b07957ec92f1113d18a2","isMergeCommit":true,"messageTitle":"Merge pull request #9 from garywongkai/Issue5-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"9eb69cd00f3a047dc6d0b2d8de7a14e956c3bf0d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"145cc54e5b0382e8cbbcfe8e934d76d6d507effb","isMergeCommit":true,"messageTitle":"Merge pull request #18 from AwJoey/master","messageBody":"Edit user guide for add, edit, list, delete, addSched commands","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"09e2c42c71515716bda7316708fd5ab2e323fc8f","isMergeCommit":false,"messageTitle":"Update DG/AboutUS.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d1c902f53f9655c1628424f0ac100e329db2efa2","isMergeCommit":true,"messageTitle":"Merge pull request #19 from garywongkai/Issue#5-About","messageBody":"Update DG/AboutUS.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"beefsausagee":{"docs":28,"functional-code":0,"test-code":0},"Morninggloryyy":{"docs":0,"functional-code":0,"test-code":0},"DominicFuMJ":{"docs":107,"functional-code":0,"test-code":0},"AwJoey":{"docs":93,"functional-code":0,"test-code":0},"garywongkai":{"docs":22,"functional-code":0,"test-code":0}},"authorContributionVariance":{"beefsausagee":280.3668,"Morninggloryyy":0.28402358,"DominicFuMJ":872.52094,"AwJoey":705.5149,"garywongkai":49.301765},"authorDisplayNameMap":{"beefsausagee":"CS2103-F15-4 ALVI.. HAN","Morninggloryyy":"CS2103-F15-4 WU J..NYAN","DominicFuMJ":"CS2103-F15-4 FU M..INIC","AwJoey":"CS2103-F15-4 AW J..JOEY","garywongkai":"CS2103-F15-4 WONG..I LI"}} diff --git a/AY2324S2-CS2103T-F10-2_tp_master/authorship.json b/AY2324S2-CS2103T-F10-2_tp_master/authorship.json index 303d0685..1ca41c9e 100644 --- a/AY2324S2-CS2103T-F10-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F10-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":"KinTatHo"},"content":"# Target Proposition","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"KinTatHo"},"content":"This app is targeted towards student tutors who are more tech savvy, tapping into their proficiency in tech to streamline the management of student contact, needs, and administrative information. The app will provide structure to organization and information retrieval, simplifying the otherwise complicated and stressful process.","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"KinTatHo"},"content":"# User Feature List","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"KinTatHo"},"content":"## Features Overview","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"KinTatHo"},"content":"- **Case Insensitive Inputs**: All inputs are processed in a case-insensitive manner.","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"KinTatHo"},"content":"- **Add Student**: `add -name {name} -address {S[PostalCode] #{UnitNumber}} -number {number} -subject {subject} -level {level}`","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"KinTatHo"},"content":"- **View Student Details**:","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"KinTatHo"},"content":" - Summary: `View -all`","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"KinTatHo"},"content":" - Detailed: `View -name {name}` or `View -id {id}`","lastModifiedDate":"2024-03-01"},{"lineNumber":16,"author":{"gitId":"KinTatHo"},"content":"- **View Summary Statistics**: `View -statistics`","lastModifiedDate":"2024-03-01"},{"lineNumber":17,"author":{"gitId":"KinTatHo"},"content":"- **Delete Student**: `Delete -id {id}`","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"KinTatHo"},"content":"## Detailed Commands","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"KinTatHo"},"content":"### Add a Student","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"KinTatHo"},"content":"- **Example**: `add -name Xiao Ming -address S000000 #01-01 -number 88888888 -subject Math -level P1`","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"KinTatHo"},"content":"- **Success**: New student appears at the top of the list.","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: Terminal shows an error in red.","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"KinTatHo"},"content":"### Viewing Student Details","lastModifiedDate":"2024-03-01"},{"lineNumber":26,"author":{"gitId":"KinTatHo"},"content":"- **Summary**: Use `View -all` to see all students.","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"KinTatHo"},"content":"- **Details**: Use `View -name {name}` or `View -id {id}` for specific students.","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"KinTatHo"},"content":"- **Success**: Appropriate student details page is shown.","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: \"No such student exists\" message is displayed.","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"KinTatHo"},"content":"### Summary Statistics","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"KinTatHo"},"content":"- **Usage**: `View -statistics`","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"KinTatHo"},"content":"- **Success**: Displays total number of students.","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: Error shown in red.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"KinTatHo"},"content":"### Delete Student Entry","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"KinTatHo"},"content":"- **Usage**: `Delete -id {id}`","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"KinTatHo"},"content":"- **Success**: Student is removed after confirmation.","lastModifiedDate":"2024-03-01"},{"lineNumber":39,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: \"No such student exists\" error if ID is not found.","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"KinTatHo"},"content":"## Parameters","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"KinTatHo"},"content":"- **Name**: Full name required, auto-incremented ID for duplicates.","lastModifiedDate":"2024-03-01"},{"lineNumber":43,"author":{"gitId":"KinTatHo"},"content":"- **Contact Number**: Must be 8 digits.","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"KinTatHo"},"content":"- **Address**: Format `S[PostalCode] #[UnitNumber]`.","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"KinTatHo"},"content":"- **Subject**: Consistent subject naming.","lastModifiedDate":"2024-03-01"},{"lineNumber":46,"author":{"gitId":"KinTatHo"},"content":"- **Level**: Format `P1-6`, `S1-5`, `J1-3`.","lastModifiedDate":"2024-03-01"},{"lineNumber":47,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":48,"author":{"gitId":"KinTatHo"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":49,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"KinTatHo"},"content":"_Commands are designed with user ease and intuitive process flows in mind._","lastModifiedDate":"2024-03-01"},{"lineNumber":51,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":52,"author":{"gitId":"KinTatHo"},"content":"* For the detailed documentation of this project, see the **[TuteeTally Product Website](https://ay2324s2-cs2103t-f10-1.github.io/tp/)**.","lastModifiedDate":"2024-03-01"},{"lineNumber":53,"author":{"gitId":"KinTatHo"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"-":4,"KinTatHo":49}},{"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":"MarcusGitty"},"content":"### Baizhou","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Windofbitter"},"content":"\u003cimg src\u003d\"images/windofbitter.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"jessicawyz"},"content":"### Ho Kin Tat","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"KinTatHo"},"content":"\u003cimg src\u003d\"images/kintatho.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"KinTatHo"},"content":"[[github](http://github.com/kintatho)]","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"KinTatHo"},"content":"[[portfolio](team/kintat.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"KinTatHo"},"content":"* Role: Developer","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"KinTatHo"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"0nesheep"},"content":"### Liu Yiyang","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"0nesheep"},"content":"\u003cimg src\u003d\"images/0nesheep.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"0nesheep"},"content":"[[github](https://github.com/0nesheep/)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"0nesheep"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"MarcusGitty"},"content":"### Marcus","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"MarcusGitty"},"content":"\u003cimg src\u003d\"images/marcusgitty.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"MarcusGitty"},"content":"[[github](http://github.com/marcusgitty)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"MarcusGitty"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"jessicawyz"},"content":"### Wu Yizheng","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"KinTatHo"},"content":"\u003cimg src\u003d\"images/jessicawyz.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"jessicawyz"},"content":"[[github](http://github.com/jessicawyz)]","lastModifiedDate":"2024-02-28"},{"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":"jessicawyz"},"content":"* Responsibilities: Deliverables","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"0nesheep":4,"MarcusGitty":5,"Windofbitter":1,"jessicawyz":4,"-":46,"KinTatHo":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":"-"},"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":"2020-05-23"},{"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":"2020-05-23"},{"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":"2020-05-23"},{"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":"2020-05-23"},{"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":"jessicawyz"},"content":"* a tutor that has a need to manage a significant number of contacts of students","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":"jessicawyz"},"content":"**Value proposition**: ","lastModifiedDate":"2024-02-28"},{"lineNumber":284,"author":{"gitId":"jessicawyz"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"jessicawyz"},"content":"* Easier time managing their contacts (fast retrieval of relevant info)","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"jessicawyz"},"content":"* More organization \u0026 personalisation","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"jessicawyz"},"content":"* Easier time to track Student’s grades and weaknesses","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"jessicawyz"},"content":"* Manage parent’s expectations","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"jessicawyz"},"content":"* Easy tracking of payment","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"jessicawyz"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"jessicawyz"},"content":"|----------|---------|-------------------------------------------|-----------------------------------------------------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | add a student | track the details of the student |","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | view student details summary on main page | get a brief idea of the student while navigating the list |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | delete a person | remove entries that I no longer need |","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | view single students detail | see the individual detail for a single student |","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | view total number of students | check if I have space for more students |","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"jessicawyz"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"*{More to be added}*","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":"MarcusGitty"},"content":"**Use case: Add a Student**","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"MarcusGitty"},"content":"**MSS** (Main Success Story)","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"MarcusGitty"},"content":"1. User initiates the command to add a student by providing the student\u0027s name, address, contact number, subject, and level.","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"MarcusGitty"},"content":"2. The AddressBook processes the provided information, adds the student particulars into the system, and assigns a unique ID to the student.","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"MarcusGitty"},"content":"3. AddressBook displays a confirmation message along with the details of the newly added student at the top of the list.","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"MarcusGitty"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"MarcusGitty"},"content":"* 1a. User inputs the command in an incorrect format.","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"MarcusGitty"},"content":" * 1a1. AddressBook shows an error message and the correct command format.","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"MarcusGitty"},"content":"* 1b. User enters a name that already exists in the AddressBook.","lastModifiedDate":"2024-02-28"},{"lineNumber":333,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"MarcusGitty"},"content":" * 1b1. AddressBook generates and assigns a unique ID to the new student to avoid duplication.","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"MarcusGitty"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":337,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":338,"author":{"gitId":"MarcusGitty"},"content":"* 1c. User omits a required field in the command.","lastModifiedDate":"2024-02-28"},{"lineNumber":339,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"MarcusGitty"},"content":" * 1c1. AddressBook shows an error message indicating the missing field.","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":344,"author":{"gitId":"MarcusGitty"},"content":"**Use case: View Student Detail**","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"MarcusGitty"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":348,"author":{"gitId":"MarcusGitty"},"content":"1. User requests to view details of students either by listing all or searching by name or ID.","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"MarcusGitty"},"content":"2. AddressBook retrieves and shows the relevant student details based on the request.","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":352,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"MarcusGitty"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"MarcusGitty"},"content":"* 2a. The requested student does not exist or the list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"MarcusGitty"},"content":" * 2a1. AddressBook displays a message indicating no such student exists or the list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"MarcusGitty"},"content":"* 2b. User inputs an incorrect command format for viewing details.","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"MarcusGitty"},"content":" * 2b1. AddressBook shows an error message and the correct command format.","lastModifiedDate":"2024-02-28"},{"lineNumber":365,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":366,"author":{"gitId":"MarcusGitty"},"content":"Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":368,"author":{"gitId":"MarcusGitty"},"content":"**Use case: View Summary Statistics**","lastModifiedDate":"2024-02-28"},{"lineNumber":369,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":370,"author":{"gitId":"MarcusGitty"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":371,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":372,"author":{"gitId":"MarcusGitty"},"content":"1. User requests to view summary statistics of students.","lastModifiedDate":"2024-02-28"},{"lineNumber":373,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":374,"author":{"gitId":"MarcusGitty"},"content":"2. AddressBook processes the request and displays the total number of students along with other relevant statistics.","lastModifiedDate":"2024-02-28"},{"lineNumber":375,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":376,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":377,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":378,"author":{"gitId":"MarcusGitty"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":379,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":380,"author":{"gitId":"MarcusGitty"},"content":"* 2a. There is an error in processing the request.","lastModifiedDate":"2024-02-28"},{"lineNumber":381,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":382,"author":{"gitId":"MarcusGitty"},"content":" * 2a1. AddressBook displays an error message in red.","lastModifiedDate":"2024-02-28"},{"lineNumber":383,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":384,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":385,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"MarcusGitty"},"content":"**Use case: Delete a Student**","lastModifiedDate":"2024-02-28"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"MarcusGitty"},"content":"1. User requests to list Student","lastModifiedDate":"2024-02-28"},{"lineNumber":391,"author":{"gitId":"MarcusGitty"},"content":"2. AddressBook shows a list of Student","lastModifiedDate":"2024-02-28"},{"lineNumber":392,"author":{"gitId":"MarcusGitty"},"content":"3. User requests to delete a specific Student in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":393,"author":{"gitId":"MarcusGitty"},"content":"4. AddressBook deletes the Student","lastModifiedDate":"2024-02-28"},{"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":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":410,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":411,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":412,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"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":417,"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":418,"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":419,"author":{"gitId":"jessicawyz"},"content":"4. System should provide quick responses to user commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"jessicawyz"},"content":"5. Should have user-friendly design for interface, so it is intuitive to use.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":434,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":435,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"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":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"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":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"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":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"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":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"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":469,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"MarcusGitty":83,"jessicawyz":18,"-":378}},{"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":"0nesheep"},"content":"# TuteeTally User Guide","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"0nesheep"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"0nesheep"},"content":"TuteeTally is a **desktop app for managing student contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TuteeTally can make student management much easier and faster than traditional GUI apps.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"0nesheep"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"0nesheep"},"content":"The system includes features for adding students, viewing student details, viewing summary statistics, and deleting student entries. All inputs are case-insensitive, enhancing user accessibility.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"0nesheep"},"content":"1. Download the latest `tuteetally.jar` from [here](https://github.com/AY2324S2-CS2103T-F10-2/tp/releases).","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"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":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"0nesheep"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar tuteetally.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"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":29,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"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":32,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"0nesheep"},"content":" * `add` - adding student to list","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"0nesheep"},"content":" * `delete` - deleting student from list","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"0nesheep"},"content":" * `view` - viewing student overview or details","lastModifiedDate":"2024-03-05"},{"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":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"0nesheep"},"content":"* Words in `{UPPER_CASE}` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"0nesheep"},"content":" e.g. in `-name/{NAME}`, `NAME` is a parameter which can be used as `add -name John Doe`.","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"0nesheep"},"content":"* `{PREFIX{FIELD}}` indicates parameters in `FIELD` need to be preceded with `PREFIX` \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"0nesheep"},"content":"e.g. in `{S{POSTAL_CODE}}`, `S` is the compulsory prefix and inputs should always start with S (e.g. `S123456`, `S888888`)","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"0nesheep"},"content":" e.g. if the command specifies `-name {NAME} -address {S{POSTALCODE}}`, `-address {S{POSTALCODE}} -name {NAME}` is also acceptable.","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":56,"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":57,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"0nesheep"},"content":"### Adding a student: `add`","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"0nesheep"},"content":"Adds a student particulars into address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"0nesheep"},"content":"Format: `add -name {NAME} -address {S{POSTAL_CODE}} #{UNIT_NUMBER} -number {NUMBER} -subject {SUBJECT} -level {LEVEL}`","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"0nesheep"},"content":"**Tip:** If addition is successful, the new student record will be shown at the top of the list.","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"0nesheep"},"content":"* `add -name Xiao Ming -address S000000 #01-01 -number 88888888 -subject Math -level P1`","lastModifiedDate":"2024-02-28"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"0nesheep"},"content":"### Deleting a student : `Delete`","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"0nesheep"},"content":"Deletes the specified student from the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"0nesheep"},"content":"Format: `Delete -id {ID}`","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"0nesheep"},"content":"* Deletes the person at the specified `id`.","lastModifiedDate":"2024-02-28"},{"lineNumber":80,"author":{"gitId":"0nesheep"},"content":"* The index refers to the 5-digit code attached to each student entry.","lastModifiedDate":"2024-02-28"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"0nesheep"},"content":"* `delete -id 88888` deletes the student with the id 8888","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"0nesheep"},"content":"### View student statistics: `View`","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"Windofbitter"},"content":"This would display the total number of students ","lastModifiedDate":"2024-02-28"},{"lineNumber":87,"author":{"gitId":"Windofbitter"},"content":"Format: `View -statistics`","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":89,"author":{"gitId":"0nesheep"},"content":"### View student summary at home page: `View`","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"Windofbitter"},"content":"This would display a summary of student particulars on the homepage.","lastModifiedDate":"2024-02-28"},{"lineNumber":91,"author":{"gitId":"Windofbitter"},"content":"Format: `View -all`","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":93,"author":{"gitId":"0nesheep"},"content":"### View student particular by name: `View` ","lastModifiedDate":"2024-03-05"},{"lineNumber":94,"author":{"gitId":"Windofbitter"},"content":"This will display a specific student particular by searching its name ","lastModifiedDate":"2024-02-28"},{"lineNumber":95,"author":{"gitId":"0nesheep"},"content":"Format: `View -name {NAME}`","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-02-28"},{"lineNumber":97,"author":{"gitId":"Windofbitter"},"content":"* `View -name Xiao Ming` would display the student particular of Xiao Ming if existed","lastModifiedDate":"2024-02-28"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":99,"author":{"gitId":"0nesheep"},"content":"### View student particular by id: `View`","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"Windofbitter"},"content":"This will display a specific particular by searching for its id","lastModifiedDate":"2024-02-28"},{"lineNumber":101,"author":{"gitId":"0nesheep"},"content":"Format: `View -id {ID}`","lastModifiedDate":"2024-03-05"},{"lineNumber":102,"author":{"gitId":"Windofbitter"},"content":"Examples; ","lastModifiedDate":"2024-02-28"},{"lineNumber":103,"author":{"gitId":"Windofbitter"},"content":"* `View -id 88888` would display the student particular for student whose id is 88888 if it exists.","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"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":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":121,"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":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"0nesheep"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-05"},{"lineNumber":128,"author":{"gitId":"0nesheep"},"content":"|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"0nesheep"},"content":"| **Add** | `add -name {NAME} -address {S{PostalCode}} #{UnitNumber} -number {number} -subject {subject} -level {level}` \u003cbr\u003e e.g., `add -name Xiao Ming -address S000000 #01-01 -number 88888888 -subject Math -level P1` |","lastModifiedDate":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"0nesheep"},"content":"| **Delete** | `Delete -id {id}`\u003cbr\u003e e.g., `delete -id 88888` |","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"0nesheep"},"content":"| **View** | `View [-statistics] [-all] [-id ID] [-name NAME]` |","lastModifiedDate":"2024-03-05"},{"lineNumber":132,"author":{"gitId":"Windofbitter"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":133,"author":{"gitId":"0nesheep"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"0nesheep":38,"Windofbitter":10,"-":85}},{"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":"MarcusGitty"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTuteeTally\u003c/a\u003e","lastModifiedDate":"2024-03-04"},{"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":{"MarcusGitty":1,"-":66}},{"path":"docs/team/kintat.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"KinTatHo"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"KinTatHo"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"KinTatHo"},"content":" title: \"Kin Tat\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"KinTatHo"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"KinTatHo"},"content":"### Personal Portfolio","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"KinTatHo":6}}] +[{"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":"KinTatHo"},"content":"# Target Proposition","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"KinTatHo"},"content":"This app is targeted towards student tutors who are more tech savvy, tapping into their proficiency in tech to streamline the management of student contact, needs, and administrative information. The app will provide structure to organization and information retrieval, simplifying the otherwise complicated and stressful process.","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"KinTatHo"},"content":"# User Feature List","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"KinTatHo"},"content":"## Features Overview","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"KinTatHo"},"content":"- **Case Insensitive Inputs**: All inputs are processed in a case-insensitive manner.","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"KinTatHo"},"content":"- **Add Student**: `add -name {name} -address {S[PostalCode] #{UnitNumber}} -number {number} -subject {subject} -level {level}`","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"KinTatHo"},"content":"- **View Student Details**:","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"KinTatHo"},"content":" - Summary: `View -all`","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"KinTatHo"},"content":" - Detailed: `View -name {name}` or `View -id {id}`","lastModifiedDate":"2024-03-01"},{"lineNumber":16,"author":{"gitId":"KinTatHo"},"content":"- **View Summary Statistics**: `View -statistics`","lastModifiedDate":"2024-03-01"},{"lineNumber":17,"author":{"gitId":"KinTatHo"},"content":"- **Delete Student**: `Delete -id {id}`","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"KinTatHo"},"content":"## Detailed Commands","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"KinTatHo"},"content":"### Add a Student","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"KinTatHo"},"content":"- **Example**: `add -name Xiao Ming -address S000000 #01-01 -number 88888888 -subject Math -level P1`","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"KinTatHo"},"content":"- **Success**: New student appears at the top of the list.","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: Terminal shows an error in red.","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"KinTatHo"},"content":"### Viewing Student Details","lastModifiedDate":"2024-03-01"},{"lineNumber":26,"author":{"gitId":"KinTatHo"},"content":"- **Summary**: Use `View -all` to see all students.","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"KinTatHo"},"content":"- **Details**: Use `View -name {name}` or `View -id {id}` for specific students.","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"KinTatHo"},"content":"- **Success**: Appropriate student details page is shown.","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: \"No such student exists\" message is displayed.","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"KinTatHo"},"content":"### Summary Statistics","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"KinTatHo"},"content":"- **Usage**: `View -statistics`","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"KinTatHo"},"content":"- **Success**: Displays total number of students.","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: Error shown in red.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"KinTatHo"},"content":"### Delete Student Entry","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"KinTatHo"},"content":"- **Usage**: `Delete -id {id}`","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"KinTatHo"},"content":"- **Success**: Student is removed after confirmation.","lastModifiedDate":"2024-03-01"},{"lineNumber":39,"author":{"gitId":"KinTatHo"},"content":"- **Failure**: \"No such student exists\" error if ID is not found.","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"KinTatHo"},"content":"## Parameters","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"KinTatHo"},"content":"- **Name**: Full name required, auto-incremented ID for duplicates.","lastModifiedDate":"2024-03-01"},{"lineNumber":43,"author":{"gitId":"KinTatHo"},"content":"- **Contact Number**: Must be 8 digits.","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"KinTatHo"},"content":"- **Address**: Format `S[PostalCode] #[UnitNumber]`.","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"KinTatHo"},"content":"- **Subject**: Consistent subject naming.","lastModifiedDate":"2024-03-01"},{"lineNumber":46,"author":{"gitId":"KinTatHo"},"content":"- **Level**: Format `P1-6`, `S1-5`, `J1-3`.","lastModifiedDate":"2024-03-01"},{"lineNumber":47,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":48,"author":{"gitId":"KinTatHo"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":49,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"KinTatHo"},"content":"_Commands are designed with user ease and intuitive process flows in mind._","lastModifiedDate":"2024-03-01"},{"lineNumber":51,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":52,"author":{"gitId":"KinTatHo"},"content":"* For the detailed documentation of this project, see the **[TuteeTally Product Website](https://ay2324s2-cs2103t-f10-1.github.io/tp/)**.","lastModifiedDate":"2024-03-01"},{"lineNumber":53,"author":{"gitId":"KinTatHo"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"-":4,"KinTatHo":49}},{"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":"MarcusGitty"},"content":"### Baizhou","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Windofbitter"},"content":"\u003cimg src\u003d\"images/windofbitter.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"MarcusGitty"},"content":"[[github](https://github.com/windofbitter)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"MarcusGitty"},"content":"[[portfolio](team/baizhou.md)]","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"jessicawyz"},"content":"### Ho Kin Tat","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"KinTatHo"},"content":"\u003cimg src\u003d\"images/kintatho.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"KinTatHo"},"content":"[[github](http://github.com/kintatho)]","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"KinTatHo"},"content":"[[portfolio](team/kintat.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"KinTatHo"},"content":"* Role: Developer","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"KinTatHo"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"0nesheep"},"content":"### Liu Yiyang","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"0nesheep"},"content":"\u003cimg src\u003d\"images/0nesheep.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"MarcusGitty"},"content":"[[github](https://github.com/0nesheep/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"MarcusGitty"},"content":"[[portfolio](team/yiyang.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"0nesheep"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"MarcusGitty"},"content":"### Marcus","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"MarcusGitty"},"content":"\u003cimg src\u003d\"images/marcusgitty.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"MarcusGitty"},"content":"[[github](http://github.com/marcusgitty)]","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"MarcusGitty"},"content":"[[portfolio](team/marcus.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"MarcusGitty"},"content":"* Responsibilities: Data","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"jessicawyz"},"content":"### Wu Yizheng","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"KinTatHo"},"content":"\u003cimg src\u003d\"images/jessicawyz.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"jessicawyz"},"content":"[[github](http://github.com/jessicawyz)]","lastModifiedDate":"2024-02-28"},{"lineNumber":64,"author":{"gitId":"MarcusGitty"},"content":"[[portfolio](team/jessica.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"jessicawyz"},"content":"* Responsibilities: Deliverables","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"0nesheep":3,"MarcusGitty":11,"Windofbitter":1,"jessicawyz":4,"-":42,"KinTatHo":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":"-"},"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":"2020-05-23"},{"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":"2020-05-23"},{"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":"2020-05-23"},{"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":"2020-05-23"},{"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":"jessicawyz"},"content":"* a tutor that has a need to manage a significant number of contacts of students","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":"jessicawyz"},"content":"**Value proposition**:","lastModifiedDate":"2024-02-28"},{"lineNumber":284,"author":{"gitId":"jessicawyz"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"jessicawyz"},"content":"* Easier time managing their contacts (fast retrieval of relevant info)","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"jessicawyz"},"content":"* More organization \u0026 personalisation","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"jessicawyz"},"content":"* Easier time to track Student’s grades and weaknesses","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"jessicawyz"},"content":"* Manage parent’s expectations","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"jessicawyz"},"content":"* Easy tracking of payment","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"jessicawyz"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"jessicawyz"},"content":"|----------|---------|-------------------------------------------|-----------------------------------------------------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | add a student | track the details of the student |","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | view student details summary on main page | get a brief idea of the student while navigating the list |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | delete a person | remove entries that I no longer need |","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | view single students detail | see the individual detail for a single student |","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"jessicawyz"},"content":"| `* * *` | Tutor | view total number of students | check if I have space for more students |","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"jessicawyz"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"*{More to be added}*","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":"MarcusGitty"},"content":"**Use case: Add a Student**","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"MarcusGitty"},"content":"**MSS** (Main Success Story)","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"MarcusGitty"},"content":"1. User initiates the command to add a student by providing the student\u0027s name, address, contact number, subject, and level.","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"MarcusGitty"},"content":"2. The AddressBook processes the provided information, adds the student particulars into the system, and assigns a unique ID to the student.","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"MarcusGitty"},"content":"3. AddressBook displays a confirmation message along with the details of the newly added student at the top of the list.","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"MarcusGitty"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"MarcusGitty"},"content":"* 1a. User inputs the command in an incorrect format.","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"MarcusGitty"},"content":" * 1a1. AddressBook shows an error message and the correct command format.","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"MarcusGitty"},"content":"* 1b. User enters a name that already exists in the AddressBook.","lastModifiedDate":"2024-02-28"},{"lineNumber":333,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"MarcusGitty"},"content":" * 1b1. AddressBook generates and assigns a unique ID to the new student to avoid duplication.","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"MarcusGitty"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":337,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":338,"author":{"gitId":"MarcusGitty"},"content":"* 1c. User omits a required field in the command.","lastModifiedDate":"2024-02-28"},{"lineNumber":339,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"MarcusGitty"},"content":" * 1c1. AddressBook shows an error message indicating the missing field.","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":344,"author":{"gitId":"MarcusGitty"},"content":"**Use case: View Student Detail**","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"MarcusGitty"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":348,"author":{"gitId":"MarcusGitty"},"content":"1. User requests to view details of students either by listing all or searching by name or ID.","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"MarcusGitty"},"content":"2. AddressBook retrieves and shows the relevant student details based on the request.","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":352,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"MarcusGitty"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"MarcusGitty"},"content":"* 2a. The requested student does not exist or the list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"MarcusGitty"},"content":" * 2a1. AddressBook displays a message indicating no such student exists or the list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"MarcusGitty"},"content":"* 2b. User inputs an incorrect command format for viewing details.","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"MarcusGitty"},"content":" * 2b1. AddressBook shows an error message and the correct command format.","lastModifiedDate":"2024-02-28"},{"lineNumber":365,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":366,"author":{"gitId":"MarcusGitty"},"content":"Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":368,"author":{"gitId":"MarcusGitty"},"content":"**Use case: View Summary Statistics**","lastModifiedDate":"2024-02-28"},{"lineNumber":369,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":370,"author":{"gitId":"MarcusGitty"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":371,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":372,"author":{"gitId":"MarcusGitty"},"content":"1. User requests to view summary statistics of students.","lastModifiedDate":"2024-02-28"},{"lineNumber":373,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":374,"author":{"gitId":"MarcusGitty"},"content":"2. AddressBook processes the request and displays the total number of students along with other relevant statistics.","lastModifiedDate":"2024-02-28"},{"lineNumber":375,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":376,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":377,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":378,"author":{"gitId":"MarcusGitty"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":379,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":380,"author":{"gitId":"MarcusGitty"},"content":"* 2a. There is an error in processing the request.","lastModifiedDate":"2024-02-28"},{"lineNumber":381,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":382,"author":{"gitId":"MarcusGitty"},"content":" * 2a1. AddressBook displays an error message in red.","lastModifiedDate":"2024-02-28"},{"lineNumber":383,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":384,"author":{"gitId":"MarcusGitty"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":385,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"MarcusGitty"},"content":"**Use case: Delete a Student**","lastModifiedDate":"2024-02-28"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"MarcusGitty"},"content":"1. User requests to list Student","lastModifiedDate":"2024-02-28"},{"lineNumber":391,"author":{"gitId":"MarcusGitty"},"content":"2. AddressBook shows a list of Student","lastModifiedDate":"2024-02-28"},{"lineNumber":392,"author":{"gitId":"MarcusGitty"},"content":"3. User requests to delete a specific Student in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":393,"author":{"gitId":"MarcusGitty"},"content":"4. AddressBook deletes the Student","lastModifiedDate":"2024-02-28"},{"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":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":410,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":411,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":412,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"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":417,"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":418,"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":419,"author":{"gitId":"jessicawyz"},"content":"4. System should provide quick responses to user commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"jessicawyz"},"content":"5. Should have user-friendly design for interface, so it is intuitive to use.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":434,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":435,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"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":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"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":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"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":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"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":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"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":469,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"MarcusGitty":83,"jessicawyz":18,"-":378}},{"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":"0nesheep"},"content":"# TuteeTally User Guide","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"0nesheep"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"0nesheep"},"content":"TuteeTally is a **desktop app for managing student contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TuteeTally can make student management much easier and faster than traditional GUI apps.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"0nesheep"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"0nesheep"},"content":"The system includes features for adding students, viewing student details, viewing summary statistics, and deleting student entries. All inputs are case-insensitive, enhancing user accessibility.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"0nesheep"},"content":"1. Download the latest `tuteetally.jar` from [here](https://github.com/AY2324S2-CS2103T-F10-2/tp/releases).","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"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":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"0nesheep"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar tuteetally.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"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":29,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"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":32,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"0nesheep"},"content":" * `add` - adding student to list","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"0nesheep"},"content":" * `delete` - deleting student from list","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"0nesheep"},"content":" * `view` - viewing student overview or details","lastModifiedDate":"2024-03-05"},{"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":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"0nesheep"},"content":"* Words in `{UPPER_CASE}` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"0nesheep"},"content":" e.g. in `-name/{NAME}`, `NAME` is a parameter which can be used as `add -name John Doe`.","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"0nesheep"},"content":"* `{PREFIX{FIELD}}` indicates parameters in `FIELD` need to be preceded with `PREFIX` \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"0nesheep"},"content":"e.g. in `{S{POSTAL_CODE}}`, `S` is the compulsory prefix and inputs should always start with S (e.g. `S123456`, `S888888`)","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"0nesheep"},"content":" e.g. if the command specifies `-name {NAME} -address {S{POSTALCODE}}`, `-address {S{POSTALCODE}} -name {NAME}` is also acceptable.","lastModifiedDate":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":56,"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":57,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"0nesheep"},"content":"### Adding a student: `add`","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"0nesheep"},"content":"Adds a student particulars into address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"0nesheep"},"content":"Format: `add -name {NAME} -address {S{POSTAL_CODE}} #{UNIT_NUMBER} -number {NUMBER} -subject {SUBJECT} -level {LEVEL}`","lastModifiedDate":"2024-03-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"0nesheep"},"content":"**Tip:** If addition is successful, the new student record will be shown at the top of the list.","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"0nesheep"},"content":"* `add -name Xiao Ming -address S000000 #01-01 -number 88888888 -subject Math -level P1`","lastModifiedDate":"2024-02-28"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"0nesheep"},"content":"### Deleting a student : `Delete`","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"0nesheep"},"content":"Deletes the specified student from the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"0nesheep"},"content":"Format: `Delete -id {ID}`","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"0nesheep"},"content":"* Deletes the person at the specified `id`.","lastModifiedDate":"2024-02-28"},{"lineNumber":80,"author":{"gitId":"0nesheep"},"content":"* The index refers to the 5-digit code attached to each student entry.","lastModifiedDate":"2024-02-28"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"0nesheep"},"content":"* `delete -id 88888` deletes the student with the id 8888","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"0nesheep"},"content":"### View student statistics: `View`","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"Windofbitter"},"content":"This would display the total number of students","lastModifiedDate":"2024-02-28"},{"lineNumber":87,"author":{"gitId":"Windofbitter"},"content":"Format: `View -statistics`","lastModifiedDate":"2024-02-28"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":89,"author":{"gitId":"0nesheep"},"content":"### View student summary at home page: `View`","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"Windofbitter"},"content":"This would display a summary of student particulars on the homepage.","lastModifiedDate":"2024-02-28"},{"lineNumber":91,"author":{"gitId":"Windofbitter"},"content":"Format: `View -all`","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":93,"author":{"gitId":"0nesheep"},"content":"### View student particular by name: `View`","lastModifiedDate":"2024-03-05"},{"lineNumber":94,"author":{"gitId":"Windofbitter"},"content":"This will display a specific student particular by searching its name","lastModifiedDate":"2024-02-28"},{"lineNumber":95,"author":{"gitId":"0nesheep"},"content":"Format: `View -name {NAME}`","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-02-28"},{"lineNumber":97,"author":{"gitId":"Windofbitter"},"content":"* `View -name Xiao Ming` would display the student particular of Xiao Ming if existed","lastModifiedDate":"2024-02-28"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":99,"author":{"gitId":"0nesheep"},"content":"### View student particular by id: `View`","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"Windofbitter"},"content":"This will display a specific particular by searching for its id","lastModifiedDate":"2024-02-28"},{"lineNumber":101,"author":{"gitId":"0nesheep"},"content":"Format: `View -id {ID}`","lastModifiedDate":"2024-03-05"},{"lineNumber":102,"author":{"gitId":"Windofbitter"},"content":"Examples;","lastModifiedDate":"2024-02-28"},{"lineNumber":103,"author":{"gitId":"Windofbitter"},"content":"* `View -id 88888` would display the student particular for student whose id is 88888 if it exists.","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"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":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":121,"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":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"0nesheep"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-05"},{"lineNumber":128,"author":{"gitId":"0nesheep"},"content":"|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"0nesheep"},"content":"| **Add** | `add -name {NAME} -address {S{PostalCode}} #{UnitNumber} -number {number} -subject {subject} -level {level}` \u003cbr\u003e e.g., `add -name Xiao Ming -address S000000 #01-01 -number 88888888 -subject Math -level P1` |","lastModifiedDate":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"0nesheep"},"content":"| **Delete** | `Delete -id {id}`\u003cbr\u003e e.g., `delete -id 88888` |","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"0nesheep"},"content":"| **View** | `View [-statistics] [-all] [-id ID] [-name NAME]` |","lastModifiedDate":"2024-03-05"},{"lineNumber":132,"author":{"gitId":"Windofbitter"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":133,"author":{"gitId":"0nesheep"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"0nesheep":38,"Windofbitter":10,"-":85}},{"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":"MarcusGitty"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTuteeTally\u003c/a\u003e","lastModifiedDate":"2024-03-04"},{"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":"MarcusGitty"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-F10-2/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"MarcusGitty":2,"-":65}},{"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":"MarcusGitty"},"content":"# TuteeTally","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"MarcusGitty"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F10-2/tp/actions)","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"MarcusGitty"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://app.codecov.io/gh/AY2324S2-CS2103T-F10-2/tp)","lastModifiedDate":"2024-03-05"},{"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":"MarcusGitty"},"content":"**TuteeTally 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-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"MarcusGitty"},"content":"* If you are interested in using TuteeTally, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"MarcusGitty"},"content":"* If you are interested about developing TuteeTally, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-05"},{"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":{"MarcusGitty":6,"-":15}},{"path":"docs/team/baizhou.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"MarcusGitty"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"MarcusGitty"},"content":" title: \"Bai Zhou\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"MarcusGitty"},"content":"### Personal Portfolio","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"MarcusGitty"},"content":"Hi I\u0027m Bai Zhou","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"MarcusGitty":7}},{"path":"docs/team/jessica.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"MarcusGitty"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"MarcusGitty"},"content":" title: \"Jessica\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"MarcusGitty"},"content":"### Personal Portfolio","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"MarcusGitty"},"content":"Hi I\u0027m Jessica.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"MarcusGitty":7}},{"path":"docs/team/kintat.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"KinTatHo"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"KinTatHo"},"content":" layout: default.md","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"KinTatHo"},"content":" title: \"Kin Tat\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"KinTatHo"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"KinTatHo"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"KinTatHo"},"content":"### Personal Portfolio","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"MarcusGitty"},"content":"Hi I\u0027m Kin Tat","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"MarcusGitty":1,"KinTatHo":6}},{"path":"docs/team/marcus.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"MarcusGitty"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"MarcusGitty"},"content":" title: \"Marcus\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"MarcusGitty"},"content":"### Personal Portfolio","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"MarcusGitty"},"content":"Hi I\u0027m Marcus","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"MarcusGitty":8}},{"path":"docs/team/yiyang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"MarcusGitty"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"MarcusGitty"},"content":" title: \"Yi Yang\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"MarcusGitty"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"MarcusGitty"},"content":"### Personal Portfolio","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"MarcusGitty"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"MarcusGitty"},"content":"Hi I\u0027m Yi Yang","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"MarcusGitty":8}}] diff --git a/AY2324S2-CS2103T-F10-2_tp_master/commits.json b/AY2324S2-CS2103T-F10-2_tp_master/commits.json index 0b254e6b..211cae78 100644 --- a/AY2324S2-CS2103T-F10-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-F10-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"0nesheep":[{"date":"2024-02-28","commitResults":[{"hash":"d69b533936093aa166a6efd8f47eb93f1c5ca58e","isMergeCommit":false,"messageTitle":"Add 0nesheep.png and edit AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"ff2c351d74110c2ac0b5adad1f5168767c771e1d","isMergeCommit":false,"messageTitle":"Edit UserGuide.md to include add and delete commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":96}}},{"hash":"69222a47a33a52c3ecbd7cb057d099d99595eb7b","isMergeCommit":false,"messageTitle":"Edit user guide intro","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":2}}},{"hash":"63a29a544614c93c5a0a6dd4d803ca8f8f741aea","isMergeCommit":true,"messageTitle":"Merge pull request #13 from AY2324S2-CS2103T-F10-2/kt-profile","messageBody":"Add profile photo and kintat.md","fileTypesAndContributionMap":{}},{"hash":"671bbab5c0b320139b193d18016772367edd00d4","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-user-guide\u0027 into branch-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"99c3c999782d56c3657288b21523998aaf86e26a","isMergeCommit":true,"messageTitle":"Merge pull request #22 from 0nesheep/branch-user-guide","messageBody":"Add delete and add command description, edit user guide intro","fileTypesAndContributionMap":{}},{"hash":"47a3ca52d12857096df82156c1b36a799c83e4de","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"782c8b96d45730736a6258da260fef0ef2385aac","isMergeCommit":true,"messageTitle":"Merge pull request #15 from 0nesheep/master","messageBody":"Add 0nesheep.png and edit AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"ba28783966983c44fbd98b43c154edce06469d43","isMergeCommit":true,"messageTitle":"Merge pull request #27 from jessicawyz/master","messageBody":"Edit naming of jessicawyz image","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"8e152e00203da2c04044a6d72012036511a5cc44","isMergeCommit":false,"messageTitle":"Update user guide to remove traces of AB3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":43}}},{"hash":"e7eb798ce14cb0f25b81d4ce92c89d15419bc6bb","isMergeCommit":true,"messageTitle":"Merge pull request #31 from MarcusGitty/Developer-Guide","messageBody":"Change default.md to reflect project name as \"TuteeTally\"","fileTypesAndContributionMap":{}},{"hash":"7ebb044cdcaed6c2aa4ebdc3b26558b776a1212e","isMergeCommit":true,"messageTitle":"Merge pull request #38 from AY2324S2-CS2103T-F10-2/branch-developer-guide","messageBody":"Add NFR in developer guide and Merge to master","fileTypesAndContributionMap":{}}]}],"MarcusGitty":[{"date":"2024-02-28","commitResults":[{"hash":"60465731a5793b1ae7c752dc5603e847aea2068f","isMergeCommit":false,"messageTitle":"Added Photo and Edited AboutUS.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}},{"hash":"dffe8757b4922fc0008db68dff169dd1377013c9","isMergeCommit":false,"messageTitle":"Add 3 use cases under DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":83,"deletions":6}}},{"hash":"e0b45d7483e128d212d760f2aebcd40a68645b73","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"39d3ae24c098e007b1e271a065f98d59db39f753","isMergeCommit":true,"messageTitle":"Merge pull request #9 from MarcusGitty/master","messageBody":"Add marcusgitty photo and edit aboutUS.md","fileTypesAndContributionMap":{}},{"hash":"41c4fbf36acf8faf382cc50c0cbf90293ecb976b","isMergeCommit":true,"messageTitle":"Merge pull request #24 from MarcusGitty/Developer-Guide","messageBody":"Add \u0027view students details, summary statistics and add students under use cases under DeveloperGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"864e865503e867bfd1b84f628f41791588ae7beb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ea8921570fa4e44532a7df91bcfc4c3dc755d55f","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-F10-2/branch-user-guide","messageBody":"Merge user guide to master","fileTypesAndContributionMap":{}},{"hash":"94e46365ea0cbbaf3951bf5476452615631d1a4f","isMergeCommit":false,"messageTitle":"Change default.md to reflect project name as \"TuteeTally\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"Windofbitter":[{"date":"2024-02-28","commitResults":[{"hash":"25c880729081540dc393e6e1900449ad1a1d0c12","isMergeCommit":false,"messageTitle":"Add Baizhou photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"f3eec7cf4780ea446359471f75e7142321e023c1","isMergeCommit":false,"messageTitle":"update user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":5}}},{"hash":"593a47cddf49f18e4f09c0c5d8ef0c4d24188fb9","isMergeCommit":true,"messageTitle":"Merge pull request #23 from Windofbitter/branch_user_guide","messageBody":"update user guide","fileTypesAndContributionMap":{}}]}],"jessicawyz":[{"date":"2024-02-28","commitResults":[{"hash":"f90ddad86e821f97fe2296ebf8fe57c6ff5b952e","isMergeCommit":false,"messageTitle":"Update AboutUs page for yizheng","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"61d58a864f12f21ee7154137fdee2658400c0e22","isMergeCommit":false,"messageTitle":"Add User profile, value proposition and User Stories","messageBody":"Update all to align with v1.1 goals\n","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":11}}},{"hash":"e10341f56dcc94085abe152795ee99cd5381d070","isMergeCommit":true,"messageTitle":"Merge pull request #19 from jessicawyz/Update-Developer_Guide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}},{"hash":"60f6979fca5907b52cc9a17577106c1fafd12e3d","isMergeCommit":true,"messageTitle":"Merge pull request #12 from jessicawyz/master","messageBody":"Update AboutUs page for yizheng","fileTypesAndContributionMap":{}},{"hash":"63046e092c91bae4ceb4cfe9ee1cc24a6110f340","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-developer-guide\u0027 into Developer-Guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"b637d912a35ece4466cea120e66ce21e1a707f01","isMergeCommit":false,"messageTitle":"Edit naming of jessicawyz image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"652ecd3185638939eb1e73cd1e82ed1ff4d8993f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-developer-guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"ee8aeaa22071a268bf475a2fc8daf8a3e5a9f574","isMergeCommit":false,"messageTitle":"Add NFR in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"f96d840346bc22ed44c6e371694f241f4c142e7e","isMergeCommit":true,"messageTitle":"Merge pull request #36 from 0nesheep/branch-user-guide","messageBody":"Update user guide to remove traces of AB3","fileTypesAndContributionMap":{}},{"hash":"2e6e4f382e2858912c3438171dc16d56b60934a5","isMergeCommit":true,"messageTitle":"Merge pull request #37 from AY2324S2-CS2103T-F10-2/branch-user-guide","messageBody":"Update user guide to remove traces of AB3","fileTypesAndContributionMap":{}}]}],"KinTatHo":[{"date":"2024-02-28","commitResults":[{"hash":"cc81a8dee48f8a2fc7088602ced464ec13191dfb","isMergeCommit":false,"messageTitle":"Add Kin Tat photo and kintat.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":6}}},{"hash":"170e1f482893d99ea9d675a13db30a981447999f","isMergeCommit":false,"messageTitle":"Add newline at READme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"392ddd370fc46f75ebf52e5a4f06f9362a49f843","isMergeCommit":false,"messageTitle":"Update README to showcase TuteeTally","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":10}}},{"hash":"5a60b5c7d94b4f19bba337b8072a68e1682b8b0e","isMergeCommit":false,"messageTitle":"Update Yizheng and my profile pic to be our github username","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-03","commitResults":[{"hash":"c458beac5f27711ddddebdc1e913b24b0b3adedb","isMergeCommit":true,"messageTitle":"Merge pull request #25 from AY2324S2-CS2103T-F10-2/readme","messageBody":"Update README to showcase TuteeTally","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"d6a499db6e9cc45f887642a007b78241202aad80","isMergeCommit":true,"messageTitle":"Merge pull request #29 from AY2324S2-CS2103T-F10-2/branch-developer-guide","messageBody":"Merge developer guide to master for deployment onto the site","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"0nesheep":{"docs":42,"functional-code":0,"test-code":0},"MarcusGitty":{"docs":89,"functional-code":0,"test-code":0},"Windofbitter":{"docs":11,"functional-code":0,"test-code":0},"jessicawyz":{"docs":22,"functional-code":0,"test-code":0},"KinTatHo":{"docs":61,"functional-code":0,"test-code":0}},"authorContributionVariance":{"0nesheep":1411.743,"MarcusGitty":938.40985,"Windofbitter":93.576385,"jessicawyz":97.416664,"KinTatHo":344.9722},"authorDisplayNameMap":{"0nesheep":"CS2103T-F10-2 LIU ..YANG","MarcusGitty":"CS2103T-F10-2 MARC.. RUI","Windofbitter":"CS2103T-F10-2 BAIZ.. CAI","jessicawyz":"CS2103T-F10-2 WU Y..HENG","KinTatHo":"CS2103T-F10-2 HO K.. TAT"}} +{"authorDailyContributionsMap":{"0nesheep":[{"date":"2024-02-28","commitResults":[{"hash":"d69b533936093aa166a6efd8f47eb93f1c5ca58e","isMergeCommit":false,"messageTitle":"Add 0nesheep.png and edit AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"ff2c351d74110c2ac0b5adad1f5168767c771e1d","isMergeCommit":false,"messageTitle":"Edit UserGuide.md to include add and delete commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":96}}},{"hash":"69222a47a33a52c3ecbd7cb057d099d99595eb7b","isMergeCommit":false,"messageTitle":"Edit user guide intro","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":2}}},{"hash":"63a29a544614c93c5a0a6dd4d803ca8f8f741aea","isMergeCommit":true,"messageTitle":"Merge pull request #13 from AY2324S2-CS2103T-F10-2/kt-profile","messageBody":"Add profile photo and kintat.md","fileTypesAndContributionMap":{}},{"hash":"671bbab5c0b320139b193d18016772367edd00d4","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-user-guide\u0027 into branch-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"99c3c999782d56c3657288b21523998aaf86e26a","isMergeCommit":true,"messageTitle":"Merge pull request #22 from 0nesheep/branch-user-guide","messageBody":"Add delete and add command description, edit user guide intro","fileTypesAndContributionMap":{}},{"hash":"47a3ca52d12857096df82156c1b36a799c83e4de","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"782c8b96d45730736a6258da260fef0ef2385aac","isMergeCommit":true,"messageTitle":"Merge pull request #15 from 0nesheep/master","messageBody":"Add 0nesheep.png and edit AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"ba28783966983c44fbd98b43c154edce06469d43","isMergeCommit":true,"messageTitle":"Merge pull request #27 from jessicawyz/master","messageBody":"Edit naming of jessicawyz image","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"8e152e00203da2c04044a6d72012036511a5cc44","isMergeCommit":false,"messageTitle":"Update user guide to remove traces of AB3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":43}}},{"hash":"e7eb798ce14cb0f25b81d4ce92c89d15419bc6bb","isMergeCommit":true,"messageTitle":"Merge pull request #31 from MarcusGitty/Developer-Guide","messageBody":"Change default.md to reflect project name as \"TuteeTally\"","fileTypesAndContributionMap":{}},{"hash":"7ebb044cdcaed6c2aa4ebdc3b26558b776a1212e","isMergeCommit":true,"messageTitle":"Merge pull request #38 from AY2324S2-CS2103T-F10-2/branch-developer-guide","messageBody":"Add NFR in developer guide and Merge to master","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"b9b7d60f2b51de4ddc21bf74d7e84e3bdad4a5c9","isMergeCommit":true,"messageTitle":"Merge pull request #39 from MarcusGitty/website-adapted","messageBody":"Update Website Config File as per Week 7 Requirement","fileTypesAndContributionMap":{}}]}],"MarcusGitty":[{"date":"2024-02-28","commitResults":[{"hash":"60465731a5793b1ae7c752dc5603e847aea2068f","isMergeCommit":false,"messageTitle":"Added Photo and Edited AboutUS.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}},{"hash":"dffe8757b4922fc0008db68dff169dd1377013c9","isMergeCommit":false,"messageTitle":"Add 3 use cases under DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":83,"deletions":6}}},{"hash":"e0b45d7483e128d212d760f2aebcd40a68645b73","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"39d3ae24c098e007b1e271a065f98d59db39f753","isMergeCommit":true,"messageTitle":"Merge pull request #9 from MarcusGitty/master","messageBody":"Add marcusgitty photo and edit aboutUS.md","fileTypesAndContributionMap":{}},{"hash":"41c4fbf36acf8faf382cc50c0cbf90293ecb976b","isMergeCommit":true,"messageTitle":"Merge pull request #24 from MarcusGitty/Developer-Guide","messageBody":"Add \u0027view students details, summary statistics and add students under use cases under DeveloperGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"864e865503e867bfd1b84f628f41791588ae7beb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-user-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ea8921570fa4e44532a7df91bcfc4c3dc755d55f","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-F10-2/branch-user-guide","messageBody":"Merge user guide to master","fileTypesAndContributionMap":{}},{"hash":"94e46365ea0cbbaf3951bf5476452615631d1a4f","isMergeCommit":false,"messageTitle":"Change default.md to reflect project name as \"TuteeTally\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"080fec5bb60e2d5e2c1fde964f0d462f536ed985","isMergeCommit":false,"messageTitle":"Change index.md to remove traces of AB3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"dfc8bdf4215bfcd6d6246bbf946431a6aa49fb8a","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F10-2:master\u0027 into website-adapted","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a3e714357d44d9adb5718b66a213350aa4d3d33e","isMergeCommit":false,"messageTitle":"Update Readme.md, AboutUs.md and deafult.md to remove traces of AB-3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}},{"hash":"942caeb9b2db8e37676441c1fd5b649acda8218f","isMergeCommit":false,"messageTitle":"Create portfolio pages for Marcus, Baizhou, Yiyang and Jessica, also change the reference for everyone to point to the correct portfolio","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":0}}},{"hash":"6b1e655d6aabfec1b88124d90f1988eda3904325","isMergeCommit":false,"messageTitle":"Remove website link for baizhou, it was previously pointing prof damith\u0027s","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"f6c04b2bbd45a2ea41064c61a832cb251e8b7400","isMergeCommit":false,"messageTitle":"Remove coding violations","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":12}}}]}],"Windofbitter":[{"date":"2024-02-28","commitResults":[{"hash":"25c880729081540dc393e6e1900449ad1a1d0c12","isMergeCommit":false,"messageTitle":"Add Baizhou photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"f3eec7cf4780ea446359471f75e7142321e023c1","isMergeCommit":false,"messageTitle":"update user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":5}}},{"hash":"593a47cddf49f18e4f09c0c5d8ef0c4d24188fb9","isMergeCommit":true,"messageTitle":"Merge pull request #23 from Windofbitter/branch_user_guide","messageBody":"update user guide","fileTypesAndContributionMap":{}}]}],"jessicawyz":[{"date":"2024-02-28","commitResults":[{"hash":"f90ddad86e821f97fe2296ebf8fe57c6ff5b952e","isMergeCommit":false,"messageTitle":"Update AboutUs page for yizheng","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"61d58a864f12f21ee7154137fdee2658400c0e22","isMergeCommit":false,"messageTitle":"Add User profile, value proposition and User Stories","messageBody":"Update all to align with v1.1 goals\n","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":11}}},{"hash":"e10341f56dcc94085abe152795ee99cd5381d070","isMergeCommit":true,"messageTitle":"Merge pull request #19 from jessicawyz/Update-Developer_Guide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}},{"hash":"60f6979fca5907b52cc9a17577106c1fafd12e3d","isMergeCommit":true,"messageTitle":"Merge pull request #12 from jessicawyz/master","messageBody":"Update AboutUs page for yizheng","fileTypesAndContributionMap":{}},{"hash":"63046e092c91bae4ceb4cfe9ee1cc24a6110f340","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-developer-guide\u0027 into Developer-Guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"b637d912a35ece4466cea120e66ce21e1a707f01","isMergeCommit":false,"messageTitle":"Edit naming of jessicawyz image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"652ecd3185638939eb1e73cd1e82ed1ff4d8993f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-developer-guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"ee8aeaa22071a268bf475a2fc8daf8a3e5a9f574","isMergeCommit":false,"messageTitle":"Add NFR in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"f96d840346bc22ed44c6e371694f241f4c142e7e","isMergeCommit":true,"messageTitle":"Merge pull request #36 from 0nesheep/branch-user-guide","messageBody":"Update user guide to remove traces of AB3","fileTypesAndContributionMap":{}},{"hash":"2e6e4f382e2858912c3438171dc16d56b60934a5","isMergeCommit":true,"messageTitle":"Merge pull request #37 from AY2324S2-CS2103T-F10-2/branch-user-guide","messageBody":"Update user guide to remove traces of AB3","fileTypesAndContributionMap":{}}]}],"KinTatHo":[{"date":"2024-02-28","commitResults":[{"hash":"cc81a8dee48f8a2fc7088602ced464ec13191dfb","isMergeCommit":false,"messageTitle":"Add Kin Tat photo and kintat.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":6}}},{"hash":"170e1f482893d99ea9d675a13db30a981447999f","isMergeCommit":false,"messageTitle":"Add newline at READme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"392ddd370fc46f75ebf52e5a4f06f9362a49f843","isMergeCommit":false,"messageTitle":"Update README to showcase TuteeTally","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":10}}},{"hash":"5a60b5c7d94b4f19bba337b8072a68e1682b8b0e","isMergeCommit":false,"messageTitle":"Update Yizheng and my profile pic to be our github username","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-03","commitResults":[{"hash":"c458beac5f27711ddddebdc1e913b24b0b3adedb","isMergeCommit":true,"messageTitle":"Merge pull request #25 from AY2324S2-CS2103T-F10-2/readme","messageBody":"Update README to showcase TuteeTally","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"d6a499db6e9cc45f887642a007b78241202aad80","isMergeCommit":true,"messageTitle":"Merge pull request #29 from AY2324S2-CS2103T-F10-2/branch-developer-guide","messageBody":"Merge developer guide to master for deployment onto the site","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"0nesheep":{"docs":41,"functional-code":0,"test-code":0},"MarcusGitty":{"docs":133,"functional-code":0,"test-code":0},"Windofbitter":{"docs":11,"functional-code":0,"test-code":0},"jessicawyz":{"docs":22,"functional-code":0,"test-code":0},"KinTatHo":{"docs":61,"functional-code":0,"test-code":0}},"authorContributionVariance":{"0nesheep":1321.1361,"MarcusGitty":1240.3077,"Windofbitter":86.98226,"jessicawyz":90.792885,"KinTatHo":322.08286},"authorDisplayNameMap":{"0nesheep":"CS2103T-F10-2 LIU ..YANG","MarcusGitty":"CS2103T-F10-2 MARC.. RUI","Windofbitter":"CS2103T-F10-2 BAIZ.. CAI","jessicawyz":"CS2103T-F10-2 WU Y..HENG","KinTatHo":"CS2103T-F10-2 HO K.. TAT"}} diff --git a/AY2324S2-CS2103T-F10-3_tp_master/authorship.json b/AY2324S2-CS2103T-F10-3_tp_master/authorship.json index 1ded7e16..a57118aa 100644 --- a/AY2324S2-CS2103T-F10-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F10-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cliftonchee"},"content":"### Ang Zi Jun Dayn","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/dayn-1.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cliftonchee"},"content":"[[github](https://github.com/dayn-1)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"cliftonchee"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"cliftonchee"},"content":"### Chee Wei Xiong Clifton","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/cliftonchee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/cliftonchee)]","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cliftonchee"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"cliftonchee"},"content":"### Jaime Ng Jia Min","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/thatgirljam.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/thatgirljam)]","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"cliftonchee"},"content":"* Role: Testing","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cliftonchee"},"content":"### Lim Rik","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/limrik.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/limrik)]","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"cliftonchee"},"content":"* Role: Code quality, Integration","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cliftonchee"},"content":"### Low Xue Ling","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/xuelinglow.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/xuelinglow)]","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"cliftonchee"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":36,"cliftonchee":20}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F10-3/tp/graph/badge.svg?token\u003dX33TASQ7AY)](https://codecov.io/gh/AY2324S2-CS2103T-F10-3/tp)","lastModifiedDate":"2024-02-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"xuelinglow"},"content":"* This is **a Command Line Interface (CLI) application for users who prefer CLI to keep track of healthcare appointments and patient information**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"xuelinglow"},"content":" * store and retrieve patient information such as name, contact information and medical allergies","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"xuelinglow"},"content":" * schedule an appointment for the patient","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"xuelinglow"},"content":" * view upcoming appointments in a concise and accessible format","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"xuelinglow"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"xuelinglow"},"content":"* The project simulates an ongoing software project for a desktop application (called CLInic) used for managing patient and appointment details.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"xuelinglow"},"content":" * It is built on the AddressBook-Level3 project.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"xuelinglow"},"content":" * It is **written in OOP fashion**. ","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"xuelinglow"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"xuelinglow"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"xuelinglow":10,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cliftonchee"},"content":"### Ang Zi Jun Dayn","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/dayn-1.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cliftonchee"},"content":"[[github](https://github.com/dayn-1)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"cliftonchee"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"cliftonchee"},"content":"### Chee Wei Xiong Clifton","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/cliftonchee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/cliftonchee)]","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cliftonchee"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"cliftonchee"},"content":"### Jaime Ng Jia Min","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/thatgirljam.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/thatgirljam)]","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"cliftonchee"},"content":"* Role: Testing","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cliftonchee"},"content":"### Lim Rik","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/limrik.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/limrik)]","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"cliftonchee"},"content":"* Role: Code quality, Integration","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cliftonchee"},"content":"### Low Xue Ling","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/xuelinglow.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/xuelinglow)]","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"cliftonchee"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":36,"cliftonchee":20}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"limrik"},"content":"* has a need to manage a significant number of patient information","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"limrik"},"content":"* has a need to schedule patients for appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"limrik"},"content":"* prefers to manage patient information and appointments in one application","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"limrik"},"content":"**Value proposition**: manage patient appointments faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"limrik"},"content":"|----------|---------|------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"limrik"},"content":"| `* * *` | user | add a new patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"limrik"},"content":"| `* * *` | user | delete a patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"limrik"},"content":"| `* * *` | user | schedule an appointment for a patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"limrik"},"content":"| `* * *` | user | cancel an appointment | account for changes in scheduling |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"limrik"},"content":"| `* * *` | user | have an overall view of upcoming patient appointments | have situational awareness of the schedule for the day |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"limrik"},"content":"| `* * *` | user | mark patients who have been seen for the day | track patient\u0027s appointment attendance |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"limrik"},"content":"| `* *` | user | update a patient\u0027s information | keep the database up to date |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"limrik"},"content":"| `* *` | user | easily filter the patients by their medical records | see which is in need of more assistance or follow up care |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"limrik"},"content":"| `* *` | user | search for patients by their name | look up their appointment information quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"limrik"},"content":"| `* *` | user | update the details of the appointment | reschedule appointments as needed |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"limrik"},"content":"| `* *` | user | view the list of patients for the given hour | see the immediate schedule |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"limrik"},"content":"| `* *` | user | tag appointments based on appointment type | I can categorize which appointments require test or room bookings |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"limrik"},"content":"| `* *` | user | tag appointments based on insurance type | prepare necessary insurance documents before patient’s appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"limrik"},"content":"| `* *` | user | input commands without having inputs to be in a specific order | key in commands fast in busy periods |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"limrik"},"content":"| `*` | user | sort the time to a patient\u0027s appointment | remind patients of their appointment |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"limrik"},"content":"| `*` | user | see how long it has been since a patient\u0027s last appointment | remind patients to come for another checkup |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"limrik"},"content":"| `*` | user | see what appointments are overlapping | ensure the patients have enough time to be seen for their different appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"limrik"},"content":"| `*` | user | set notifications for upcoming appointments | staff and patients can be well informed early in advance |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"limrik"},"content":"| `*` | user | track if the patients have been sent reminders on their appointments | patients do not get spammed with reminders |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"limrik"},"content":"| `*` | user | be notified of upcoming appointments on entry into the system | will not miss approaching deadlines |","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"limrik"},"content":"| `*` | user | easily contact the patients via SMS or email through the program | update patients about their details and upcoming appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"limrik"},"content":"| `*` | user | quickly navigate the CLI with intuitive commands | increase my efficiency |","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"limrik"},"content":"| `*` | user | check if patients are related to one another | have alternate contacts |","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"limrik"},"content":"| `*` | user | update or create new records in bulk | process a family more efficiently |","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"limrik"},"content":"| `*` | user | set recurring tasks | I do not have to keep scheduling recurring appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"limrik"},"content":"| `*` | user | retrieve past records or revert changes easily | revert my changes if I accidentally delete or wrongly edit a patient’s records |","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"limrik"},"content":"| `*` | user | select what information is available when I view the list of patients | cater the view to my needs |","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"limrik"},"content":"| `*` | user | add notes to a patient | include other additional information |","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"limrik"},"content":"| `*` | user | easily generate reports of the patient details and export it to the doctor/patient | have easy access |","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"ThatGirlJam"},"content":"// EXAMPLE //","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"ThatGirlJam"},"content":"// EXAMPLE //","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC1) : Add new patient information to the database**","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to add new patient information","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook validates the information ","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"ThatGirlJam"},"content":"3. AddressBook adds the patient\u0027s information to the database","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"ThatGirlJam"},"content":"* 1a. The required information is missing.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"ThatGirlJam"},"content":" * 1a1. AddressBook prompts user to input required information.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The given information is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"ThatGirlJam"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-05"},{"lineNumber":376,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":377,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC2) : Delete patient information from the database**","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":381,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":383,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":386,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"ThatGirlJam"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"ThatGirlJam"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC3) : Schedule an appointment for the patient**","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to schedule an appointment for a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook prompts User to input appointment details","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"ThatGirlJam"},"content":"5. User inputs appointment details ","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"ThatGirlJam"},"content":"6. AddressBook schedules appointment for the patient","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"ThatGirlJam"},"content":"* 5a. The given appointment details are invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"ThatGirlJam"},"content":" * 5a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC4) : Cancel an appointment**","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":430,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to cancel an appointment for a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook prompts User to input appointment details","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"ThatGirlJam"},"content":"5. User inputs appointment details","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"ThatGirlJam"},"content":"6. AddressBook cancels appointment for the patient","lastModifiedDate":"2024-03-05"},{"lineNumber":435,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":444,"author":{"gitId":"ThatGirlJam"},"content":"* 5a. The given appointment details are invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":445,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":446,"author":{"gitId":"ThatGirlJam"},"content":" * 5a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":447,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":448,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":449,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":450,"author":{"gitId":"ThatGirlJam"},"content":"* 6a. There is no appointment scheduled for that slot.","lastModifiedDate":"2024-03-05"},{"lineNumber":451,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":452,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":453,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":454,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC5) : View all upcoming appointments displayed in a concise and accessible format**","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":457,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":458,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to view all upcoming appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":459,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of upcoming appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":460,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":461,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":462,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":463,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":464,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":465,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":466,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":467,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":468,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":469,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC6) : Mark patient appointment as seen for that day**","lastModifiedDate":"2024-03-05"},{"lineNumber":470,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":471,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":472,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":473,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to \u003cins\u003e view all upcoming appointments (UC5) \u003c/ins\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":474,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of upcoming appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":475,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to mark a specific appointment in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":476,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook marks the appointment","lastModifiedDate":"2024-03-05"},{"lineNumber":477,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":478,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":479,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":480,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":481,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":482,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":483,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":484,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":485,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":486,"author":{"gitId":"ThatGirlJam"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":487,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":488,"author":{"gitId":"ThatGirlJam"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":489,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":490,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"dayn-1"},"content":"1. Patients should not have overlapping appointments","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"dayn-1"},"content":"2. Appointments cannot be backdated or scheduled for past dates","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"dayn-1"},"content":"3. Should be compatible with any _mainstream OS_ with Java `11` or above installed.","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"dayn-1"},"content":"4. Should load patient records and appointment details within three seconds","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"dayn-1"},"content":"5. Should be able to hold up to 1000 patients without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"dayn-1"},"content":"6. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"dayn-1"},"content":"7. The project is expected to adhere to a schedule that delivers a feature set for each milestone","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"dayn-1"},"content":"8. The product is not required to have mouse-click navigation ","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"dayn-1"},"content":"9. The product is not required to integrate with other systems ","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"dayn-1"},"content":"10. The product should avoid terminology or graphics that are insensitive to patients ","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"dayn-1"},"content":"11. The product should be for a single user (not a multi-user product)","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":508,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"dayn-1"},"content":"* **Appointment**: A designated time slot for a patient to visit the clinic","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"dayn-1"},"content":"* **Appointment Type**: Categorises the purpose of visit eg. Vaccination, Medical Check-up, etc ","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"dayn-1"},"content":"* **Insurance Type**: Categorises insurance schemes applicable to the patient eg. Medisave, ElderShield, etc.","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"dayn-1"},"content":"* **Medical Records**: Refer to details of patients\u0027 medical allergies only (as at v1.2)","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"dayn-1"},"content":"* **Recurring Appointments**: Refer to appointments that occur regularly eg. weekly or monthly","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":523,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":524,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"limrik":34,"dayn-1":16,"ThatGirlJam":137,"-":381}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eCLInic\u003c/a\u003e","lastModifiedDate":"2024-02-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"dayn-1"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-F10-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"dayn-1":1,"-":66}}] diff --git a/AY2324S2-CS2103T-F10-3_tp_master/commits.json b/AY2324S2-CS2103T-F10-3_tp_master/commits.json index 40f72212..acdc5a45 100644 --- a/AY2324S2-CS2103T-F10-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-F10-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"xuelinglow":[{"date":"2024-02-26","commitResults":[{"hash":"60140fddf4b87e9814941999e41a827c1e8df916","isMergeCommit":false,"messageTitle":"Tutorial: Adding a command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":197,"deletions":12},"test-code":{"insertions":111,"deletions":13}}},{"hash":"51ac38ab9e498ad935592942169f9cdfd52ca285","isMergeCommit":true,"messageTitle":"Merge pull request #1 from xuelinglow/tutorial-adding-command","messageBody":"Tutorial adding command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"8eb8572994384f65edc39c9318d5b73024ca1957","isMergeCommit":false,"messageTitle":"Revert \"Tutorial adding command\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":12,"deletions":197},"test-code":{"insertions":13,"deletions":111}}},{"hash":"bae7d62c9565035abd38ca730ee9d5aec3c43172","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-F10-3/revert-1-tutorial-adding-command","messageBody":"Revert \"Tutorial adding command\"","fileTypesAndContributionMap":{}}]}],"limrik":[],"dayn-1":[{"date":"2024-02-26","commitResults":[{"hash":"99e9801c9226edd9b5275e90534dbb51cffe1999","isMergeCommit":false,"messageTitle":"Add config changes for MarkBind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"ThatGirlJam":[],"cliftonchee":[{"date":"2024-02-26","commitResults":[{"hash":"56c596beb4c4d3873db8c729eafa8c9fc27b7d75","isMergeCommit":false,"messageTitle":"Test CodeCov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"6b7579fbbd898771b0c8044ef6362424dfa0135f","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Rename codecov org name","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"369d5d67b2f8e08d2beb321748842eec486abf42","isMergeCommit":false,"messageTitle":"Update About Us Page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":25}}},{"hash":"db4e1f75dd480d6123e6e2644292bd83a65fac03","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F10-3:master\u0027 into about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f147112f372ccf321c5f5923c973b4fe18dcf46","isMergeCommit":true,"messageTitle":"Merge pull request #5 from cliftonchee/about-us","messageBody":"Update About Us Page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"xuelinglow":{"docs":0,"functional-code":0,"test-code":0},"limrik":{"docs":0,"functional-code":0,"test-code":0},"dayn-1":{"docs":0,"functional-code":0,"test-code":0},"ThatGirlJam":{"docs":0,"functional-code":0,"test-code":0},"cliftonchee":{"docs":20,"functional-code":0,"test-code":0}},"authorContributionVariance":{"xuelinglow":16495.883,"limrik":0.0,"dayn-1":0.33057854,"ThatGirlJam":0.0,"cliftonchee":165.86778},"authorDisplayNameMap":{"xuelinglow":"CS2103T-F10-3 LOW ..LING","limrik":"CS2103T-F10-3 LIM .. RIK","dayn-1":"CS2103T-F10-3 ANG ..DAYN","ThatGirlJam":"CS2103T-F10-3 JAIM.. MIN","cliftonchee":"CS2103T-F10-3 CHEE..FTON"}} +{"authorDailyContributionsMap":{"xuelinglow":[{"date":"2024-02-26","commitResults":[{"hash":"60140fddf4b87e9814941999e41a827c1e8df916","isMergeCommit":false,"messageTitle":"Tutorial: Adding a command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":197,"deletions":12},"test-code":{"insertions":111,"deletions":13}}},{"hash":"51ac38ab9e498ad935592942169f9cdfd52ca285","isMergeCommit":true,"messageTitle":"Merge pull request #1 from xuelinglow/tutorial-adding-command","messageBody":"Tutorial adding command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"8eb8572994384f65edc39c9318d5b73024ca1957","isMergeCommit":false,"messageTitle":"Revert \"Tutorial adding command\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":12,"deletions":197},"test-code":{"insertions":13,"deletions":111}}},{"hash":"bae7d62c9565035abd38ca730ee9d5aec3c43172","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-F10-3/revert-1-tutorial-adding-command","messageBody":"Revert \"Tutorial adding command\"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"8ee08b45cb7d234849a3a16e3b754d515e27d72d","isMergeCommit":false,"messageTitle":"Update README with mock UI","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}}]}],"limrik":[{"date":"2024-03-05","commitResults":[{"hash":"a71bb54727dd8528d6d987aad89e263b11ff301f","isMergeCommit":false,"messageTitle":"Update product scope and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":35,"deletions":10}}}]},{"date":"2024-03-06","commitResults":[{"hash":"31a49ca1ae91043347e2a9cd91cc3f1bf1779759","isMergeCommit":true,"messageTitle":"Merge pull request #14 from dayn-1/v1.1-NFR-Glossary","messageBody":"Add NFR and Glossary to Developer Guide","fileTypesAndContributionMap":{}}]}],"dayn-1":[{"date":"2024-02-26","commitResults":[{"hash":"99e9801c9226edd9b5275e90534dbb51cffe1999","isMergeCommit":false,"messageTitle":"Add config changes for MarkBind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"25ef5d4e73fddf9e675fd27b08e07c0595c1bb34","isMergeCommit":true,"messageTitle":"Merge pull request #11 from limrik/master","messageBody":"Update product scope and user stories","fileTypesAndContributionMap":{}},{"hash":"7f4172f22aab9cdcbe4eb49df80771752235a821","isMergeCommit":true,"messageTitle":"Merge pull request #12 from xuelinglow/master","messageBody":"Update README with mock UI","fileTypesAndContributionMap":{}},{"hash":"0ba591baebd3473011144c36d2a708076b239eb1","isMergeCommit":false,"messageTitle":"Update NFR and Glossary for v1.1","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":9}}}]}],"ThatGirlJam":[{"date":"2024-03-05","commitResults":[{"hash":"5f5dff257e941102e6fb9782b32327d08d6ae3c6","isMergeCommit":false,"messageTitle":"Add use cases for the initial features for week 7 practice iteration","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":140,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"75c4563c8d5748ae74c6b6e0d0d022e1fe7e5dd1","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ThatGirlJam/DeveloperGuideUseCases","messageBody":"Add Use Cases to DG v1.1","fileTypesAndContributionMap":{}}]}],"cliftonchee":[{"date":"2024-02-26","commitResults":[{"hash":"56c596beb4c4d3873db8c729eafa8c9fc27b7d75","isMergeCommit":false,"messageTitle":"Test CodeCov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"6b7579fbbd898771b0c8044ef6362424dfa0135f","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Rename codecov org name","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"369d5d67b2f8e08d2beb321748842eec486abf42","isMergeCommit":false,"messageTitle":"Update About Us Page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":25}}},{"hash":"db4e1f75dd480d6123e6e2644292bd83a65fac03","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F10-3:master\u0027 into about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f147112f372ccf321c5f5923c973b4fe18dcf46","isMergeCommit":true,"messageTitle":"Merge pull request #5 from cliftonchee/about-us","messageBody":"Update About Us Page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"xuelinglow":{"docs":10,"functional-code":0,"test-code":0},"limrik":{"docs":34,"functional-code":0,"test-code":0},"dayn-1":{"docs":17,"functional-code":0,"test-code":0},"ThatGirlJam":{"docs":137,"functional-code":0,"test-code":0},"cliftonchee":{"docs":20,"functional-code":0,"test-code":0}},"authorContributionVariance":{"xuelinglow":14316.387,"limrik":143.78697,"dayn-1":47.668636,"ThatGirlJam":1411.6685,"cliftonchee":142.82841},"authorDisplayNameMap":{"xuelinglow":"CS2103T-F10-3 LOW ..LING","limrik":"CS2103T-F10-3 LIM .. RIK","dayn-1":"CS2103T-F10-3 ANG ..DAYN","ThatGirlJam":"CS2103T-F10-3 JAIM.. MIN","cliftonchee":"CS2103T-F10-3 CHEE..FTON"}} diff --git a/AY2324S2-CS2103T-F10-4_tp_master/authorship.json b/AY2324S2-CS2103T-F10-4_tp_master/authorship.json index fe51488c..f9e63bdc 100644 --- a/AY2324S2-CS2103T-F10-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F10-4_tp_master/authorship.json @@ -1 +1 @@ -[] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F10-4/tp/graph/badge.svg?token\u003dH2P9OR4JFH)](https://codecov.io/gh/AY2324S2-CS2103T-F10-4/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":"YowSiaoKang"},"content":"* Welcome to **Match**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"YowSiaoKang"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"YowSiaoKang"},"content":" Created for Bob who:","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"YowSiaoKang"},"content":" - works as the coordinator of a volunteer befriending organization","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"YowSiaoKang"},"content":" - can type fast due to his 20 years of experience working in an office job","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"YowSiaoKang"},"content":" - has carpal tunnel and would appreciate if there is smart tools to reduce the typing","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"YowSiaoKang"},"content":" - is forgetful and forgets the person that he has assigns","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"YowSiaoKang"},"content":" - day-to-day job involves matching volunteers and beneficiaries","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"YowSiaoKang"},"content":"\u003e [!CAUTION]","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"YowSiaoKang"},"content":"\u003e Problem: The challenge of efficiently managing a diverse group of volunteers. This includes tracking each volunteer’s availability, skills, interests, and participation in various activities.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"YowSiaoKang"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"YowSiaoKang"},"content":"\u003e [!TIP]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"YowSiaoKang"},"content":"\u003e Solution: Match streamlines volunteer management, facilitating efficient scheduling, and coordination of volunteers, ultimately saving time and resources for organizations focused on social impact.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"YowSiaoKang"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://ay2324s2-cs2103t-f10-4.github.io/tp/)**.","lastModifiedDate":"2024-02-21"},{"lineNumber":21,"author":{"gitId":"YowSiaoKang"},"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":{"-":6,"YowSiaoKang":15}},{"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":"xuwen-ho"},"content":"**Target User Profile**:","lastModifiedDate":"2024-03-06"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"xuwen-ho"},"content":"- Bob is the coordinator of a volunteer befriending organization.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"xuwen-ho"},"content":"- He can type fast due to his 20 years of experience working in an office job.","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"xuwen-ho"},"content":"- He has carpal tunnel and would appreciate tools to reduce typing.","lastModifiedDate":"2024-03-06"},{"lineNumber":268,"author":{"gitId":"xuwen-ho"},"content":"- His day-to-day job involves matching volunteers and beneficiaries based on availability.","lastModifiedDate":"2024-03-06"},{"lineNumber":269,"author":{"gitId":"xuwen-ho"},"content":"- He is forgetful and often forgets the assignments he has made.","lastModifiedDate":"2024-03-06"},{"lineNumber":270,"author":{"gitId":"xuwen-ho"},"content":"- He has bad eyesight and cannot see small or low-contrast texts.","lastModifiedDate":"2024-03-06"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"xuwen-ho"},"content":"**Value Proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"xuwen-ho"},"content":"Match streamlines volunteer management, facilitating efficient scheduling and coordination of volunteers, ultimately saving time and resources for organizations focused on social impact. It helps Bob efficiently manage a diverse group of volunteers by tracking their availability.","lastModifiedDate":"2024-03-06"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"xuwen-ho"},"content":"**User Stories**:","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"xuwen-ho"},"content":"Priority: High (must have) - `*`, Medium (nice to have) - `*`, Low (unlikely to have) - `_`","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"xuwen-ho"},"content":"| Priority | As a … | I want to … | So that I can… |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"xuwen-ho"},"content":"| `*` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"xuwen-ho"},"content":"| `***` | coordinator | add a new volunteer | keep track of all volunteers in the organization |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"xuwen-ho"},"content":"| `***` | coordinator | view a volunteer\u0027s details | match volunteers with beneficiaries based on their availability, skills, and interests |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"xuwen-ho"},"content":"| `***` | coordinator | update a volunteer\u0027s information | keep volunteer information up-to-date |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"xuwen-ho"},"content":"| `***` | coordinator | delete a volunteer | remove volunteers who are no longer with the organization |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"xuwen-ho"},"content":"| `***` | coordinator | find volunteers by name | quickly locate a specific volunteer\u0027s information |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"xuwen-ho"},"content":"| `**` | coordinator | view a list of all volunteers | have an overview of all registered volunteers |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"xuwen-ho"},"content":"| `**` | coordinator | find volunteers by availability | match volunteers with beneficiaries based on their availability |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"xuwen-ho"},"content":"| `*` | coordinator | use a GUI with large fonts and high contrast | easily view information with my bad eyesight |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"xuwen-ho"},"content":"| `*` | coordinator | use keyboard shortcuts | reduce typing due to my carpal tunnel |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"xuwen-ho"},"content":"**Use Cases**:","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"xuwen-ho"},"content":"**Use case: Add a Volunteer**","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"xuwen-ho"},"content":"**Actor**: Coordinator (Bob)","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"xuwen-ho"},"content":"**Precondition**: Coordinator has launched the application and is on the main screen.","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"xuwen-ho"},"content":"**Main Success Scenario**:","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"xuwen-ho"},"content":"1. Coordinator selects the \"Add Volunteer\" option.","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"xuwen-ho"},"content":"2. The system prompts the coordinator to enter the volunteer\u0027s name, phone number, email and availability.","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"xuwen-ho"},"content":"3. Coordinator enters the required information in the correct format.","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"xuwen-ho"},"content":"4. The system validates the input and displays a confirmation message: \"Volunteer [volunteer_name] has been added successfully.\"","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"xuwen-ho"},"content":"5. The new volunteer\u0027s information is displayed in the GUI.","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"xuwen-ho"},"content":"**Extensions**:","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"xuwen-ho"},"content":"3a. The coordinator enters invalid data for any of the fields.","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"xuwen-ho"},"content":" 3a1. The system displays an error message indicating the nature of the error (e.g., \"[Parameter] is invalid,\" \"[Parameter] is missing,\" \"[Parameter] is specified multiple times\").","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"xuwen-ho"},"content":" 3a2. The coordinator corrects the input and continues from step 3.","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"xuwen-ho"},"content":"**Use case: Find a Volunteer\u0027s Information**","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"xuwen-ho"},"content":"**Actor**: Coordinator (Bob)","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"xuwen-ho"},"content":"**Precondition**: Coordinator has launched the application and is on the main screen.","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"xuwen-ho"},"content":"**Main Success Scenario**:","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"xuwen-ho"},"content":"1. Coordinator selects the \"Find Volunteer\" option.","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"xuwen-ho"},"content":"2. The system prompts the coordinator to enter the volunteer\u0027s name.","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"xuwen-ho"},"content":"3. Coordinator enters the volunteer\u0027s name (or a part of it).","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"xuwen-ho"},"content":"4. The system displays all volunteers whose names contain the entered keywords.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"xuwen-ho"},"content":"**Extensions**:","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"xuwen-ho"},"content":"4a. No volunteers match the entered name.","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"xuwen-ho"},"content":" 4a1. The system displays an error message: \"No volunteers found.\"","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"xuwen-ho"},"content":"**Use case: View Entire List of Volunteers**","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"xuwen-ho"},"content":"**Actor**: Coordinator (Bob)","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"xuwen-ho"},"content":"**Precondition**: Coordinator has launched the application and is on the main screen.","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"xuwen-ho"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"xuwen-ho"},"content":"**Main Success Scenario**:","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"xuwen-ho"},"content":"1. Coordinator selects the \"List Volunteers\" option.","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"xuwen-ho"},"content":"2. The system displays the entire list of volunteers, along with their details, in the GUI.","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"xuwen-ho"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"xuwen-ho"},"content":"**Extensions**:","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"xuwen-ho"},"content":"2a. There are no volunteers in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"xuwen-ho"},"content":" 2a1. The system displays a message: \"There are no volunteers in the address book.\"","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"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":347,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":354,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"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":363,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"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":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"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":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"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":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"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":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"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":397,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"xuwen-ho":58,"-":349}}] diff --git a/AY2324S2-CS2103T-F10-4_tp_master/commits.json b/AY2324S2-CS2103T-F10-4_tp_master/commits.json index f215ede5..915dc4e7 100644 --- a/AY2324S2-CS2103T-F10-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-F10-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"tayziyi":[],"Benson15912":[],"SimKianSeng":[],"xuwen-ho":[],"YowSiaoKang":[]},"authorFileTypeContributionMap":{"tayziyi":{"docs":0,"functional-code":0,"test-code":0},"Benson15912":{"docs":0,"functional-code":0,"test-code":0},"SimKianSeng":{"docs":0,"functional-code":0,"test-code":0},"xuwen-ho":{"docs":0,"functional-code":0,"test-code":0},"YowSiaoKang":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tayziyi":0.0,"Benson15912":0.0,"SimKianSeng":0.0,"xuwen-ho":0.0,"YowSiaoKang":0.0},"authorDisplayNameMap":{"tayziyi":"CS2103T-F10-4 TAY ..I YI","Benson15912":"CS2103T-F10-4 BENS..KIAT","SimKianSeng":"CS2103T-F10-4 SIM ..SENG","xuwen-ho":"CS2103T-F10-4 HO X.. WEN","YowSiaoKang":"CS2103T-F10-4 YOW ..KANG"}} +{"authorDailyContributionsMap":{"tayziyi":[],"Benson15912":[],"SimKianSeng":[{"date":"2024-03-06","commitResults":[{"hash":"4398bdc84ea6b48391c697125dc98cd0dc1820ec","isMergeCommit":true,"messageTitle":"Merge pull request #11 from YowSiaoKang/master","messageBody":"Update ReadME and project website","fileTypesAndContributionMap":{}}]}],"xuwen-ho":[{"date":"2024-03-06","commitResults":[{"hash":"4cbfc70d87b0205ba60a752874233aa68e3c28f9","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":33}}}]}],"YowSiaoKang":[{"date":"2024-03-06","commitResults":[{"hash":"d69abd35dcd59f35e423dba7cf1d35aa79884c39","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":9}}},{"hash":"a122e5df1b812c26497b805713ea2cbf78027fab","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}]},"authorFileTypeContributionMap":{"tayziyi":{"docs":0,"functional-code":0,"test-code":0},"Benson15912":{"docs":0,"functional-code":0,"test-code":0},"SimKianSeng":{"docs":0,"functional-code":0,"test-code":0},"xuwen-ho":{"docs":58,"functional-code":0,"test-code":0},"YowSiaoKang":{"docs":15,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tayziyi":0.0,"Benson15912":0.0,"SimKianSeng":0.0,"xuwen-ho":588.0,"YowSiaoKang":63.90533},"authorDisplayNameMap":{"tayziyi":"CS2103T-F10-4 TAY ..I YI","Benson15912":"CS2103T-F10-4 BENS..KIAT","SimKianSeng":"CS2103T-F10-4 SIM ..SENG","xuwen-ho":"CS2103T-F10-4 HO X.. WEN","YowSiaoKang":"CS2103T-F10-4 YOW ..KANG"}} diff --git a/AY2324S2-CS2103T-F12-2_tp_master/authorship.json b/AY2324S2-CS2103T-F12-2_tp_master/authorship.json index d0ac14ab..755ce3cb 100644 --- a/AY2324S2-CS2103T-F12-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F12-2_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":"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":"-"},"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}}] diff --git a/AY2324S2-CS2103T-F12-2_tp_master/commits.json b/AY2324S2-CS2103T-F12-2_tp_master/commits.json index 7f66585d..1400d074 100644 --- a/AY2324S2-CS2103T-F12-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-F12-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Ko-Khan":[],"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}}}]}],"bennyLCK":[],"Howlong11":[],"H4mes":[]},"authorFileTypeContributionMap":{"Ko-Khan":{"docs":0,"functional-code":0,"test-code":0},"Murugan-Maniish":{"docs":1,"functional-code":0,"test-code":0},"bennyLCK":{"docs":0,"functional-code":0,"test-code":0},"Howlong11":{"docs":0,"functional-code":0,"test-code":0},"H4mes":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Ko-Khan":0.0,"Murugan-Maniish":0.75,"bennyLCK":0.0,"Howlong11":0.0,"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":{}}]}],"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"}} diff --git a/AY2324S2-CS2103T-F12-3_tp_master/authorship.json b/AY2324S2-CS2103T-F12-3_tp_master/authorship.json index e274f85e..440ad453 100644 --- a/AY2324S2-CS2103T-F12-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F12-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"[![codecov badge](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)","lastModifiedDate":"2024-02-23"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-02-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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"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":12,"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":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":{"agreatdayy":2,"-":14}}] +[{"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":"agreatdayy"},"content":"[![codecov badge](https://codecov.io/gh/nus-cs2103-AY2324S2/tp/graph/badge.svg?token\u003dPBBJNYE8U5)](https://codecov.io/gh/nus-cs2103-AY2324S2/tp)","lastModifiedDate":"2024-02-23"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-02-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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"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":12,"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":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":{"agreatdayy":2,"-":14}},{"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":"agreatdayy"},"content":"You can reach us at the email `chujie[at]comp.nus.edu.sg`","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":"agreatdayy"},"content":"### Tee Chu Jie","lastModifiedDate":"2024-03-06"},{"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":"TarinPairor"},"content":"- Role: Project Advisor","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":"### Carsten Joe","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"TarinPairor"},"content":"- Role: Team Lead","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"TarinPairor"},"content":"- Responsibilities: UI","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"TarinPairor"},"content":"### Pairor Tarin","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"TarinPairor"},"content":"\u003cimg src\u003d\"images/TarinPairorProfile.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"TarinPairor"},"content":"[[github](http://github.com/TarinPairor)]","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"agreatdayy"},"content":"### Lee Xin Yuan","lastModifiedDate":"2024-03-06"},{"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":"agreatdayy"},"content":"[[github](http://github.com/agreatdayy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"agreatdayy"},"content":"[[portfolio](team/xinyuan.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"TarinPairor"},"content":"- Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"TarinPairor"},"content":"- Responsibilities: Dev Ops","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"agreatdayy":6,"TarinPairor":8,"-":33}},{"path":"docs/team/xinyuan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"agreatdayy"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"agreatdayy"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"agreatdayy"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"agreatdayy"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"agreatdayy"},"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":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"agreatdayy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"agreatdayy"},"content":"* **New Feature**: ","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"agreatdayy"},"content":" * ","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"agreatdayy"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"agreatdayy"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"agreatdayy"},"content":" * ","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"agreatdayy"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"agreatdayy"},"content":" * ","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"agreatdayy"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"agreatdayy"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"agreatdayy"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"agreatdayy"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"agreatdayy"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"agreatdayy"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"agreatdayy"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"agreatdayy"},"content":" * PRs reviewed (with non-trivial review comments): ","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"agreatdayy"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"agreatdayy"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"agreatdayy"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"agreatdayy"},"content":" * ","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"agreatdayy"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"agreatdayy"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"agreatdayy":38}}] diff --git a/AY2324S2-CS2103T-F12-3_tp_master/commits.json b/AY2324S2-CS2103T-F12-3_tp_master/commits.json index a63f26ff..09f31cb8 100644 --- a/AY2324S2-CS2103T-F12-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-F12-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"agreatdayy":[{"date":"2024-02-23","commitResults":[{"hash":"9f1a768a9e2e216bf71bac6ebf5cc41dfbd72805","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Add codecov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]}],"Wyrkx":[{"date":"2024-02-24","commitResults":[{"hash":"ee1e19c316aeb35a7fcd63137c65de97f11bcf8b","isMergeCommit":true,"messageTitle":"Merge pull request #1 from agreatdayy/patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"TarinPairor":[],"tamagochuuu":[]},"authorFileTypeContributionMap":{"agreatdayy":{"docs":2,"functional-code":0,"test-code":0},"Wyrkx":{"docs":0,"functional-code":0,"test-code":0},"TarinPairor":{"docs":0,"functional-code":0,"test-code":0},"tamagochuuu":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"agreatdayy":1.0,"Wyrkx":0.0,"TarinPairor":0.0,"tamagochuuu":0.0},"authorDisplayNameMap":{"agreatdayy":"CS2103T-F12-3 LEE ..YUAN","Wyrkx":"CS2103T-F12-3 CARS..E NG","TarinPairor":"CS2103T-F12-3 PAIR..ARIN","tamagochuuu":"CS2103T-F12-3 TEE .. JIE"}} +{"authorDailyContributionsMap":{"agreatdayy":[{"date":"2024-02-23","commitResults":[{"hash":"9f1a768a9e2e216bf71bac6ebf5cc41dfbd72805","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Add codecov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-06","commitResults":[{"hash":"588eaab92d71473568ca6d4101ee3c3f597e5ce6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Change project member names","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"88b201c384215cb64c537b9054ee6538f29be751","isMergeCommit":false,"messageTitle":"AboutUs.md: Update Xin Yuan\u0027s info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":12}}},{"hash":"3d40151fde0eb3b09530f20311019f45f2149608","isMergeCommit":false,"messageTitle":"AboutUs.md: Update XY\u0027s github and portfolio","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"49f14c8c7532937ece212c3b9207654c43d55e66","isMergeCommit":false,"messageTitle":"Add xinyuan.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":38,"deletions":0}}},{"hash":"f78f26f647c0a7f32e9cd07e8146546784094a91","isMergeCommit":true,"messageTitle":"Merge pull request #8 from agreatdayy/master","messageBody":"Add xinyuan.md","fileTypesAndContributionMap":{}}]}],"Wyrkx":[{"date":"2024-02-24","commitResults":[{"hash":"ee1e19c316aeb35a7fcd63137c65de97f11bcf8b","isMergeCommit":true,"messageTitle":"Merge pull request #1 from agreatdayy/patch-1","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"f4eb09bc2a70b18464e8b58b541c2cdf130fea7f","isMergeCommit":true,"messageTitle":"Merge pull request #7 from agreatdayy/master","messageBody":"Update AboutUs.md Test","fileTypesAndContributionMap":{}}]}],"TarinPairor":[{"date":"2024-03-06","commitResults":[{"hash":"6b52012a39b39e20f52548f887552c4b2ba728af","isMergeCommit":false,"messageTitle":"AboutUs.md Update Tarin\u0027s info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":11}}}]}],"tamagochuuu":[]},"authorFileTypeContributionMap":{"agreatdayy":{"docs":46,"functional-code":0,"test-code":0},"Wyrkx":{"docs":0,"functional-code":0,"test-code":0},"TarinPairor":{"docs":8,"functional-code":0,"test-code":0},"tamagochuuu":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"agreatdayy":289.60947,"Wyrkx":0.0,"TarinPairor":28.402367,"tamagochuuu":0.0},"authorDisplayNameMap":{"agreatdayy":"CS2103T-F12-3 LEE ..YUAN","Wyrkx":"CS2103T-F12-3 CARS..E NG","TarinPairor":"CS2103T-F12-3 PAIR..ARIN","tamagochuuu":"CS2103T-F12-3 TEE .. JIE"}} diff --git a/AY2324S2-CS2103T-F13-2_tp_master/authorship.json b/AY2324S2-CS2103T-F13-2_tp_master/authorship.json index a756066b..8cb7bcc2 100644 --- a/AY2324S2-CS2103T-F13-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F13-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F13-2/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":"# FAPro","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"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":"ziyang27"},"content":"## What is it? ","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"SimHanKiong"},"content":"**FAPro** is a desktop application for financial advisors to manage the contacts of their clients. This is especially built for those with more than 50 clients to handle.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"## What value it brings?","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"This application revolutionizes client engagement for financial advisors by facilitating strategic communication and personalized service.","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"content":"* It ensures advisors efficiently prioritize outreach, focusing on clients requiring immediate attention, thereby optimizing client satisfaction and retention.","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"content":"* The system offers insights into clients’ financial product portfolios, enabling advisors to tailor advice and recommendations effectively.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"content":"* Additionally, it streamlines scheduling, allowing for seamless planning of future communications.","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"ziyang27"},"content":"This approach not only elevates the advisor-client relationship but also enhances the advisor\u0027s ability to serve with precision and foresight, setting a new standard in client management excellence.","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"## Where can I find out more?","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"Check out our detailed documentation of this project at **[FAPro Product Website](https://ay2324s2-cs2103t-f13-2.github.io/tp/)**.","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"## Acknowledgements","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"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":{"SimHanKiong":1,"ziyang27":18,"-":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":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"### Sim Han Kiong","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"SimHanKiong"},"content":"\u003cimg src\u003d\"images/simhankiong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"content":"[[github](https://github.com/SimHanKiong)]","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/simhankiong.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"[[email](e0957654@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Code quality","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":"### Tan Yun Chao","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":"[[github](http://github.com/tanyunchao)]","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/tanyunchao.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"[[email](tanyunchao@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":"* Role: Developer, Git expert","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":"### Tiong Chuan Yao","lastModifiedDate":"2024-02-29"},{"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":"ziyang27"},"content":"[[github](http://github.com/Colex2000)] ","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/tiongchuanyao.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":"[[email](tiongchuanyao@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Testing + Scheduling and tracking","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"### Tan Zi Yang","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"ziyang27"},"content":"\u003cimg src\u003d\"images/ziyang27.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"ziyang27"},"content":"[[github](http://github.com/ziyang27)]","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/tanziyang.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":51,"author":{"gitId":"ziyang27"},"content":"[[email](tan.ziyang@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Documentation + Deliverables and deadlines","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"SimHanKiong":1,"ziyang27":22,"-":31}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"SimHanKiong"},"content":"# FAPro Developer Guide","lastModifiedDate":"2024-03-03"},{"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":"SimHanKiong"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"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":"ziyang27"},"content":"* is a financial advisor","lastModifiedDate":"2024-02-29"},{"lineNumber":278,"author":{"gitId":"ziyang27"},"content":"* is currently studying at the same time","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"ziyang27"},"content":"* has a need to manage over 50 clients while juggling with school commitments","lastModifiedDate":"2024-02-29"},{"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":"SimHanKiong"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app and revolutionizes client engagement ","lastModifiedDate":"2024-03-04"},{"lineNumber":286,"author":{"gitId":"SimHanKiong"},"content":"for financial advisors by facilitating strategic communication and personalized service.","lastModifiedDate":"2024-03-04"},{"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":"SimHanKiong"},"content":"|---------|---------------------------------------------|-------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"SimHanKiong"},"content":"| `* * *` | user | find a person by name | locate details of people without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":299,"author":{"gitId":"ziyang27"},"content":"| `* * *` | financial advisor with more than 50 clients | easily identity those that I haven\u0027t reach out to for a long time | contact them and check on their progress as well as well-being |","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"ziyang27"},"content":"| `* * *` | financial advisor with many upcoming meeting | easily view my schedule | plan and prepare the respective information for the respective meetings, serving the client more effectively |","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"SimHanKiong"},"content":"| `* * *` | financial advisor who provides multiple plans for my clients | tag clients based on their existing plans | keep track of which clients hold which policies |","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"SimHanKiong"},"content":"| `* * *` | financial advisor who provides multiple plans for my clients | find clients based on their existing plans | provide personalised service to each type of policy holder |","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"ziyang27"},"content":"| `* * *` | financial advisor with more than 50 clients | view a client\u0027s profile with a few simple commands | have the relevant information at hand when planning and during the consultations |","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"ziyang27"},"content":"| `* * ` | financial advisor with more than 50 clients | set reminders for all the clients\u0027 birthday | build personal connection through timely greetings |","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"SimHanKiong"},"content":"| `*` | user with many people in the address book | sort people by name | locate a person easily |","lastModifiedDate":"2024-03-03"},{"lineNumber":306,"author":{"gitId":"ziyang27"},"content":"| `*` | financial advisor who wants to help my clients reach their goals | keep track of their goals and financial progress | provide a more curated and personalized service |","lastModifiedDate":"2024-02-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"SimHanKiong"},"content":"(For all use cases below, the **System** is `FAPro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-03"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-03"},{"lineNumber":319,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-03"},{"lineNumber":320,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"ziyang27"},"content":"**Use case: Viewing a client\u0027s profile**","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"ziyang27"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"SimHanKiong"},"content":"2. FAPro shows a list of people","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"ziyang27"},"content":"3. User requests to view the profile of the client in the list","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"ziyang27"},"content":"4. FAPro shows the detailed profile of the client","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":346,"author":{"gitId":"ziyang27"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":347,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"ziyang27"},"content":"**Extensions**","lastModifiedDate":"2024-02-29"},{"lineNumber":349,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":350,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Tagging a client**","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"SimHanKiong"},"content":"3. User requests to tag a specific person in the list with a specified tag","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"SimHanKiong"},"content":"4. AddressBook tags the person","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"SimHanKiong"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"SimHanKiong"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"SimHanKiong"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Removing tags from a client**","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"SimHanKiong"},"content":"3. User requests to remove tags from a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"SimHanKiong"},"content":"4. AddressBook removes the tags of the person","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"SimHanKiong"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"SimHanKiong"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"SimHanKiong"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Finding all clients that contain any of the tags**","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":402,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to find people containing any of the specified tags","lastModifiedDate":"2024-03-04"},{"lineNumber":403,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":404,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"SimHanKiong"},"content":"* 1a. One of the tags do not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"SimHanKiong"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Finding all clients that contain all the tags**","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to find people containing all the specified tags","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"SimHanKiong"},"content":"* 1a. One of the tags do not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"SimHanKiong"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"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":"SimHanKiong"},"content":"2. Should be able to hold up to 1000 people without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":426,"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":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"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":"SimHanKiong"},"content":"1. Deleting a person while all people are being shown","lastModifiedDate":"2024-03-03"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"SimHanKiong"},"content":" 1. Prerequisites: List all people using the `list` command. Multiple people in the list.","lastModifiedDate":"2024-03-03"},{"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":{"SimHanKiong":78,"ziyang27":19,"-":391}},{"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":"ziyang27"},"content":"# FAPro User Guide","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"ziyang27"},"content":"FAPro is a **desktop app for managing clients\u0027 contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). ","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"If you ","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* are a financial advisor,","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"content":"* can type fast, ","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"content":"* have more than 50 clients, ","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"content":"FAPro can get your client management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":"1. Download the latest `fapro.jar` from [here](https://github.com/AY2324S2-CS2103T-F13-2/tp/releases).","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your FAPro.","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar fapro.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"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":36,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"SimHanKiong"},"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 FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"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":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"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":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"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":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"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":71,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":73,"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":74,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Format: `help`","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":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"SimHanKiong"},"content":"Adds a person to FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":93,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":94,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"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":"SimHanKiong"},"content":"### Listing all people : `list`","lastModifiedDate":"2024-03-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"SimHanKiong"},"content":"Shows a list of all people in FAPro.","lastModifiedDate":"2024-03-03"},{"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":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"SimHanKiong"},"content":"Edits an existing person in FAPro.","lastModifiedDate":"2024-03-03"},{"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":"SimHanKiong"},"content":"### Locating people by name: `find`","lastModifiedDate":"2024-03-04"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"SimHanKiong"},"content":"Finds people whose names contain any of the given keywords.","lastModifiedDate":"2024-03-04"},{"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":"SimHanKiong"},"content":"### Locating people by tag : `tagfind`","lastModifiedDate":"2024-03-04"},{"lineNumber":142,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":143,"author":{"gitId":"SimHanKiong"},"content":"Finds people who are associated with the specified tag.","lastModifiedDate":"2024-03-04"},{"lineNumber":144,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":145,"author":{"gitId":"SimHanKiong"},"content":"Format: `tagfind TAG`","lastModifiedDate":"2024-03-04"},{"lineNumber":146,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":147,"author":{"gitId":"SimHanKiong"},"content":"* The search is case-insensitive. e.g. `CaR` will match `car`.","lastModifiedDate":"2024-03-04"},{"lineNumber":148,"author":{"gitId":"SimHanKiong"},"content":"* As long as the person has 1 tag that matches, the person will be listed.","lastModifiedDate":"2024-03-04"},{"lineNumber":149,"author":{"gitId":"SimHanKiong"},"content":"* Only full words will be matched e.g. `cars` will not match `car`.","lastModifiedDate":"2024-03-04"},{"lineNumber":150,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":151,"author":{"gitId":"SimHanKiong"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":152,"author":{"gitId":"SimHanKiong"},"content":"* `tagfind car` returns all people with a `car` tag.","lastModifiedDate":"2024-03-04"},{"lineNumber":153,"author":{"gitId":"SimHanKiong"},"content":"* `tagfind HOUSING` returns all people with a `housing` tag.","lastModifiedDate":"2024-03-04"},{"lineNumber":154,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":155,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"SimHanKiong"},"content":"Deletes the specified person from FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"SimHanKiong"},"content":"* `list` followed by `delete 2` deletes the 2nd person in FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":167,"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":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"SimHanKiong"},"content":"### Viewing the detailed profile a person : `select`","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"SimHanKiong"},"content":"View a more detailed profile of the specified person from FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":172,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"ziyang27"},"content":"Format: `select INDEX`","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"ziyang27"},"content":"* Displays the profile of the client at the specified `INDEX`.","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"ziyang27"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-02-29"},{"lineNumber":177,"author":{"gitId":"ziyang27"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":178,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":179,"author":{"gitId":"ziyang27"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":180,"author":{"gitId":"SimHanKiong"},"content":"* `list` followed by `select 2` shows the detailed profile of the 2nd person in FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":181,"author":{"gitId":"ziyang27"},"content":"* `find Betsy` followed by `select 1` shows the detailed profile of the 1st person in the results of the `find` command.","lastModifiedDate":"2024-02-29"},{"lineNumber":182,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":183,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"SimHanKiong"},"content":"Clears all entries from FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"ziyang27"},"content":"FAPro 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-29"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":201,"author":{"gitId":"ziyang27"},"content":"FAPro 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-02-29"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":206,"author":{"gitId":"ziyang27"},"content":"If your changes to the data file makes its format invalid, FAPro 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-29"},{"lineNumber":207,"author":{"gitId":"SimHanKiong"},"content":"Furthermore, certain edits can cause FAPro 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-03"},{"lineNumber":208,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"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":"ziyang27"},"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 FAPro home folder.","lastModifiedDate":"2024-02-29"},{"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":"2023-09-12"},{"lineNumber":229,"author":{"gitId":"SimHanKiong"},"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":"2024-03-04"},{"lineNumber":230,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"SimHanKiong"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g. `delete 3`","lastModifiedDate":"2024-03-04"},{"lineNumber":232,"author":{"gitId":"SimHanKiong"},"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":"2024-03-04"},{"lineNumber":233,"author":{"gitId":"SimHanKiong"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g. `find James Jake`","lastModifiedDate":"2024-03-04"},{"lineNumber":234,"author":{"gitId":"SimHanKiong"},"content":"**TagFind**| `tagfind TAG` \u003cbr\u003e e.g. `tagfind car`","lastModifiedDate":"2024-03-04"},{"lineNumber":235,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"SimHanKiong"},"content":"**Select** | `select INDEX`\u003cbr\u003e e.g. `select 1`","lastModifiedDate":"2024-03-04"},{"lineNumber":237,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"SimHanKiong":34,"ziyang27":27,"-":176}},{"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":"ziyang27"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eFAPro\u003c/a\u003e","lastModifiedDate":"2024-02-24"},{"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":{"ziyang27":1,"-":66}},{"path":"docs/team/simhankiong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}},{"path":"docs/team/tanyunchao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}},{"path":"docs/team/tanziyang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}},{"path":"docs/team/tiongchuanyao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F13-2/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":"# FAPro","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"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":"ziyang27"},"content":"## What is it? ","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"SimHanKiong"},"content":"**FAPro** is a desktop application for financial advisors to manage the contacts of their clients. This is especially built for those with more than 50 clients to handle.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"## What value it brings?","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"This application revolutionizes client engagement for financial advisors by facilitating strategic communication and personalized service.","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"content":"* It ensures advisors efficiently prioritize outreach, focusing on clients requiring immediate attention, thereby optimizing client satisfaction and retention.","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"content":"* The system offers insights into clients’ financial product portfolios, enabling advisors to tailor advice and recommendations effectively.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"content":"* Additionally, it streamlines scheduling, allowing for seamless planning of future communications.","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"ziyang27"},"content":"This approach not only elevates the advisor-client relationship but also enhances the advisor\u0027s ability to serve with precision and foresight, setting a new standard in client management excellence.","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"## Where can I find out more?","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"Check out our detailed documentation of this project at **[FAPro Product Website](https://ay2324s2-cs2103t-f13-2.github.io/tp/)**.","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"## Acknowledgements","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"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":{"SimHanKiong":1,"ziyang27":18,"-":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":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"### Sim Han Kiong","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"SimHanKiong"},"content":"\u003cimg src\u003d\"images/simhankiong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"content":"[[github](https://github.com/SimHanKiong)]","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/simhankiong.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"[[email](e0957654@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Code quality","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":"### Tan Yun Chao","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":"[[github](http://github.com/tanyunchao)]","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/tanyunchao.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"[[email](tanyunchao@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":"* Role: Developer, Git expert","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":"### Tiong Chuan Yao","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Colex2000"},"content":"\u003cimg src\u003d\"images/colex2000.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":"[[github](http://github.com/Colex2000)] ","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/tiongchuanyao.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":"[[email](tiongchuanyao@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Testing + Scheduling and tracking","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"### Tan Zi Yang","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"ziyang27"},"content":"\u003cimg src\u003d\"images/ziyang27.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"ziyang27"},"content":"[[github](http://github.com/ziyang27)]","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"ziyang27"},"content":"[[portfolio](team/tanziyang.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":51,"author":{"gitId":"ziyang27"},"content":"[[email](tan.ziyang@u.nus.edu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"ziyang27"},"content":"* Responsibilities: Documentation + Deliverables and deadlines","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"SimHanKiong":1,"ziyang27":22,"Colex2000":1,"-":30}},{"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":"SimHanKiong"},"content":"# FAPro Developer Guide","lastModifiedDate":"2024-03-03"},{"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":"SimHanKiong"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"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":"ziyang27"},"content":"* is a financial advisor","lastModifiedDate":"2024-02-29"},{"lineNumber":278,"author":{"gitId":"ziyang27"},"content":"* is currently studying at the same time","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"ziyang27"},"content":"* has a need to manage over 50 clients while juggling with school commitments","lastModifiedDate":"2024-02-29"},{"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":"SimHanKiong"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app and revolutionizes client engagement ","lastModifiedDate":"2024-03-04"},{"lineNumber":286,"author":{"gitId":"SimHanKiong"},"content":"for financial advisors by facilitating strategic communication and personalized service.","lastModifiedDate":"2024-03-04"},{"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":"SimHanKiong"},"content":"|---------|---------------------------------------------|-------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"SimHanKiong"},"content":"| `* * *` | user | find a person by name | locate details of people without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":299,"author":{"gitId":"ziyang27"},"content":"| `* * *` | financial advisor with more than 50 clients | easily identity those that I haven\u0027t reach out to for a long time | contact them and check on their progress as well as well-being |","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"ziyang27"},"content":"| `* * *` | financial advisor with many upcoming meeting | easily view my schedule | plan and prepare the respective information for the respective meetings, serving the client more effectively |","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"SimHanKiong"},"content":"| `* * *` | financial advisor who provides multiple plans for my clients | tag clients based on their existing plans | keep track of which clients hold which policies |","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"SimHanKiong"},"content":"| `* * *` | financial advisor who provides multiple plans for my clients | find clients based on their existing plans | provide personalised service to each type of policy holder |","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"ziyang27"},"content":"| `* * *` | financial advisor with more than 50 clients | view a client\u0027s profile with a few simple commands | have the relevant information at hand when planning and during the consultations |","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"ziyang27"},"content":"| `* * ` | financial advisor with more than 50 clients | set reminders for all the clients\u0027 birthday | build personal connection through timely greetings |","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"SimHanKiong"},"content":"| `*` | user with many people in the address book | sort people by name | locate a person easily |","lastModifiedDate":"2024-03-03"},{"lineNumber":306,"author":{"gitId":"ziyang27"},"content":"| `*` | financial advisor who wants to help my clients reach their goals | keep track of their goals and financial progress | provide a more curated and personalized service |","lastModifiedDate":"2024-02-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"SimHanKiong"},"content":"(For all use cases below, the **System** is `FAPro` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-03"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-03"},{"lineNumber":319,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-03"},{"lineNumber":320,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"ziyang27"},"content":"**Use case: Viewing a client\u0027s profile**","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"ziyang27"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"SimHanKiong"},"content":"2. FAPro shows a list of people","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"ziyang27"},"content":"3. User requests to view the profile of the client in the list","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"ziyang27"},"content":"4. FAPro shows the detailed profile of the client","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":346,"author":{"gitId":"ziyang27"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":347,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"ziyang27"},"content":"**Extensions**","lastModifiedDate":"2024-02-29"},{"lineNumber":349,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":350,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Tagging a client**","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"SimHanKiong"},"content":"3. User requests to tag a specific person in the list with a specified tag","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"SimHanKiong"},"content":"4. AddressBook tags the person","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"SimHanKiong"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"SimHanKiong"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"SimHanKiong"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Removing tags from a client**","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to list people","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"SimHanKiong"},"content":"3. User requests to remove tags from a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"SimHanKiong"},"content":"4. AddressBook removes the tags of the person","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"SimHanKiong"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"SimHanKiong"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"SimHanKiong"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"SimHanKiong"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Finding all clients that contain any of the tags**","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":402,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to find people containing any of the specified tags","lastModifiedDate":"2024-03-04"},{"lineNumber":403,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":404,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"SimHanKiong"},"content":"* 1a. One of the tags do not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"SimHanKiong"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"SimHanKiong"},"content":"**Use case: Finding all clients that contain all the tags**","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"SimHanKiong"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"SimHanKiong"},"content":"1. User requests to find people containing all the specified tags","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"SimHanKiong"},"content":"2. AddressBook shows a list of people","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"SimHanKiong"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"SimHanKiong"},"content":"* 1a. One of the tags do not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"SimHanKiong"},"content":" * 1a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"SimHanKiong"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"Colex2000"},"content":"**Use case: Clearing all contacts in FAPro**","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"Colex2000"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"Colex2000"},"content":"1. User requests to clear all contacts.","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"Colex2000"},"content":"2. The system clears all contacts.","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"Colex2000"},"content":"**Use case: Exiting FAPro**","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"Colex2000"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"Colex2000"},"content":"1. User enters the exit command.","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"Colex2000"},"content":"2. FAPro closes the window and its system.","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":436,"author":{"gitId":"Colex2000"},"content":"**Use case: Tagging a client as last contacted**","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":438,"author":{"gitId":"Colex2000"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"Colex2000"},"content":"1. User requests to tag a client with date and time.","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"Colex2000"},"content":"2. The system tags the client as \u0027last contacted\u0027 with given date and time.","lastModifiedDate":"2024-03-06"},{"lineNumber":442,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":443,"author":{"gitId":"Colex2000"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"Colex2000"},"content":"* 2a. Client name does not exist.","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"Colex2000"},"content":" * 2a1. The system shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"Colex2000"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"Colex2000"},"content":"* 2b. The system found more than 1 matching name.","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"Colex2000"},"content":" * 2b1. The system lists all matching clients\u0027 name with their ID code and other details for identification.","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"author":{"gitId":"Colex2000"},"content":" * 2b2. User enters the ID code shown from the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":450,"author":{"gitId":"Colex2000"},"content":" Steps 2b1-2b2 are repeated until the data entered are valid.","lastModifiedDate":"2024-03-06"},{"lineNumber":451,"author":{"gitId":"Colex2000"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"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":456,"author":{"gitId":"SimHanKiong"},"content":"2. Should be able to hold up to 1000 people without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":457,"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":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":464,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":474,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":475,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"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":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"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":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"SimHanKiong"},"content":"1. Deleting a person while all people are being shown","lastModifiedDate":"2024-03-03"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"SimHanKiong"},"content":" 1. Prerequisites: List all people using the `list` command. Multiple people in the list.","lastModifiedDate":"2024-03-03"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"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":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"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":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"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":509,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"SimHanKiong":78,"ziyang27":19,"Colex2000":30,"-":392}},{"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":"ziyang27"},"content":"# FAPro User Guide","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"ziyang27"},"content":"FAPro is a **desktop app for managing clients\u0027 contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). ","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"If you ","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* are a financial advisor,","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"content":"* can type fast, ","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"content":"* have more than 50 clients, ","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"content":"FAPro can get your client management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","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":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":"1. Download the latest `fapro.jar` from [here](https://github.com/AY2324S2-CS2103T-F13-2/tp/releases).","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your FAPro.","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar fapro.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"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":36,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"SimHanKiong"},"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 FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","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":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"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":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"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":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"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":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"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":71,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":73,"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":74,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Format: `help`","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":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"SimHanKiong"},"content":"Adds a person to FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":93,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":94,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"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":"SimHanKiong"},"content":"### Listing all people : `list`","lastModifiedDate":"2024-03-04"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"SimHanKiong"},"content":"Shows a list of all people in FAPro.","lastModifiedDate":"2024-03-03"},{"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":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"SimHanKiong"},"content":"Edits an existing person in FAPro.","lastModifiedDate":"2024-03-03"},{"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":"SimHanKiong"},"content":"### Locating people by name: `find`","lastModifiedDate":"2024-03-04"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"SimHanKiong"},"content":"Finds people whose names contain any of the given keywords.","lastModifiedDate":"2024-03-04"},{"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":"SimHanKiong"},"content":"### Locating people by tag : `tagfind`","lastModifiedDate":"2024-03-04"},{"lineNumber":142,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":143,"author":{"gitId":"SimHanKiong"},"content":"Finds people who are associated with the specified tag.","lastModifiedDate":"2024-03-04"},{"lineNumber":144,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":145,"author":{"gitId":"SimHanKiong"},"content":"Format: `tagfind TAG`","lastModifiedDate":"2024-03-04"},{"lineNumber":146,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":147,"author":{"gitId":"SimHanKiong"},"content":"* The search is case-insensitive. e.g. `CaR` will match `car`.","lastModifiedDate":"2024-03-04"},{"lineNumber":148,"author":{"gitId":"SimHanKiong"},"content":"* As long as the person has 1 tag that matches, the person will be listed.","lastModifiedDate":"2024-03-04"},{"lineNumber":149,"author":{"gitId":"SimHanKiong"},"content":"* Only full words will be matched e.g. `cars` will not match `car`.","lastModifiedDate":"2024-03-04"},{"lineNumber":150,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":151,"author":{"gitId":"SimHanKiong"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":152,"author":{"gitId":"SimHanKiong"},"content":"* `tagfind car` returns all people with a `car` tag.","lastModifiedDate":"2024-03-04"},{"lineNumber":153,"author":{"gitId":"SimHanKiong"},"content":"* `tagfind HOUSING` returns all people with a `housing` tag.","lastModifiedDate":"2024-03-04"},{"lineNumber":154,"author":{"gitId":"SimHanKiong"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":155,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"SimHanKiong"},"content":"Deletes the specified person from FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"SimHanKiong"},"content":"* `list` followed by `delete 2` deletes the 2nd person in FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":167,"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":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"SimHanKiong"},"content":"### Viewing the detailed profile a person : `select`","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"SimHanKiong"},"content":"View a more detailed profile of the specified person from FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":172,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"ziyang27"},"content":"Format: `select INDEX`","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"ziyang27"},"content":"* Displays the profile of the client at the specified `INDEX`.","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"ziyang27"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-02-29"},{"lineNumber":177,"author":{"gitId":"ziyang27"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":178,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":179,"author":{"gitId":"ziyang27"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":180,"author":{"gitId":"SimHanKiong"},"content":"* `list` followed by `select 2` shows the detailed profile of the 2nd person in FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":181,"author":{"gitId":"ziyang27"},"content":"* `find Betsy` followed by `select 1` shows the detailed profile of the 1st person in the results of the `find` command.","lastModifiedDate":"2024-02-29"},{"lineNumber":182,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":183,"author":{"gitId":"Colex2000"},"content":"### Tag a client\u0027s profile as last contacted : `lastcontact`","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"Colex2000"},"content":"Adds a client to the recently contacted list in FAPro.","lastModifiedDate":"2024-03-06"},{"lineNumber":186,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":187,"author":{"gitId":"Colex2000"},"content":"Format: `lastcontact NAME [d/DATE] [tm/TIME]`","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":189,"author":{"gitId":"Colex2000"},"content":"* The input is case-insensitive. e.g. `JoHn Doe` will match `john doe`.","lastModifiedDate":"2024-03-06"},{"lineNumber":190,"author":{"gitId":"Colex2000"},"content":"* In case of duplicate names, all matching names will be listed with their ID code and other details.","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"Colex2000"},"content":"* User will need to add the respective ID code to existing input in case of duplicate.","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"Colex2000"},"content":"* `DATE` and `TIME` format should be in `DD-MM-YYYY` and `HHMM` respectively.","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":194,"author":{"gitId":"Colex2000"},"content":"Example:","lastModifiedDate":"2024-03-06"},{"lineNumber":195,"author":{"gitId":"Colex2000"},"content":"* `lastcontact John doe d/05-09-2024 tm/1955` tags the client with name `john doe` and assigns the date `05 Sep 2024 7:55pm` as last contacted.","lastModifiedDate":"2024-03-06"},{"lineNumber":196,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"Colex2000"},"content":"Example (For duplicate names):","lastModifiedDate":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"Colex2000"},"content":"* `lastcontact John doe#0005 d/05-09-2024 tm/1955` tags the client with name `john doe#0005` and assigns the date `05 Sep 2024 7:55pm` as last contacted.","lastModifiedDate":"2024-03-06"},{"lineNumber":199,"author":{"gitId":"Colex2000"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":200,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"SimHanKiong"},"content":"Clears all entries from FAPro.","lastModifiedDate":"2024-03-03"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"ziyang27"},"content":"FAPro 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-29"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":218,"author":{"gitId":"ziyang27"},"content":"FAPro 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-02-29"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":220,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"ziyang27"},"content":"If your changes to the data file makes its format invalid, FAPro 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-29"},{"lineNumber":224,"author":{"gitId":"SimHanKiong"},"content":"Furthermore, certain edits can cause FAPro 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-03"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":227,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"ziyang27"},"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 FAPro home folder.","lastModifiedDate":"2024-02-29"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","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":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":238,"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":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":240,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":242,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":246,"author":{"gitId":"SimHanKiong"},"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":"2024-03-04"},{"lineNumber":247,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"SimHanKiong"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g. `delete 3`","lastModifiedDate":"2024-03-04"},{"lineNumber":249,"author":{"gitId":"SimHanKiong"},"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":"2024-03-04"},{"lineNumber":250,"author":{"gitId":"SimHanKiong"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g. `find James Jake`","lastModifiedDate":"2024-03-04"},{"lineNumber":251,"author":{"gitId":"SimHanKiong"},"content":"**TagFind**| `tagfind TAG` \u003cbr\u003e e.g. `tagfind car`","lastModifiedDate":"2024-03-04"},{"lineNumber":252,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"SimHanKiong"},"content":"**Select** | `select INDEX`\u003cbr\u003e e.g. `select 1`","lastModifiedDate":"2024-03-04"},{"lineNumber":254,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"SimHanKiong":34,"ziyang27":27,"Colex2000":17,"-":176}},{"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":"ziyang27"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eFAPro\u003c/a\u003e","lastModifiedDate":"2024-02-24"},{"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":{"ziyang27":1,"-":66}},{"path":"docs/team/simhankiong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}},{"path":"docs/team/tanyunchao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}},{"path":"docs/team/tanziyang.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}},{"path":"docs/team/tiongchuanyao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"ziyang27"},"content":" layout: default.md","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"ziyang27"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"ziyang27"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"ziyang27"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"ziyang27"},"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":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"ziyang27"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":14,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":15,"author":{"gitId":"ziyang27"},"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-29"},{"lineNumber":16,"author":{"gitId":"ziyang27"},"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":17,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"ziyang27"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"ziyang27"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"ziyang27"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"ziyang27"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"ziyang27"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"ziyang27"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"ziyang27"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"ziyang27"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":30,"author":{"gitId":"ziyang27"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"ziyang27"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"ziyang27"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"ziyang27"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"ziyang27"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-29"},{"lineNumber":35,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"ziyang27"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":37,"author":{"gitId":"ziyang27"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"ziyang27"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-29"},{"lineNumber":39,"author":{"gitId":"ziyang27"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"ziyang27"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-29"},{"lineNumber":41,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":42,"author":{"gitId":"ziyang27"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":43,"author":{"gitId":"ziyang27"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-29"},{"lineNumber":44,"author":{"gitId":"ziyang27"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"ziyang27"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"ziyang27"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"ziyang27":46}}] diff --git a/AY2324S2-CS2103T-F13-2_tp_master/commits.json b/AY2324S2-CS2103T-F13-2_tp_master/commits.json index a3259909..6e3e0372 100644 --- a/AY2324S2-CS2103T-F13-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-F13-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"SimHanKiong":[{"date":"2024-03-03","commitResults":[{"hash":"43ed111253679062e94fa672dbf06472036159a7","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ziyang27/updating-AboutUs-page","messageBody":"Update AboutUs page with roles, links, and my own photo","fileTypesAndContributionMap":{}},{"hash":"08f3796cd552191b7e9ab4a69df135a172229a6c","isMergeCommit":true,"messageTitle":"Merge pull request #15 from ziyang27/updating-README-page","messageBody":"Update readme page","fileTypesAndContributionMap":{}},{"hash":"660434233cc4285402b19c98d246a2270588398b","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"0eef02dd9453968999e4a154bcc4eef0939054a0","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ziyang27/branch-update-UG","messageBody":"Add the select feature description in the user guide","fileTypesAndContributionMap":{}},{"hash":"cf4fe7a047b05ff84e6accc4d67363fbc5056858","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}},{"hash":"ab70f3daaa8f0bf0d3cfb7e32cf06b0bab6331bb","isMergeCommit":true,"messageTitle":"Merge pull request #21 from ziyang27/branch-update-DG","messageBody":"Update developer guide based on our product","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"d0f34f027fbd1dfd1045c74ac18de30ab6bdaa29","isMergeCommit":false,"messageTitle":"Add picture to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"02b3c5adf5a77dd497047d02440ebe74bb903f7e","isMergeCommit":false,"messageTitle":"Add find by tag feature to UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":9}}},{"hash":"6e120c97d4e84183a451e516c2e288218b47b9ad","isMergeCommit":false,"messageTitle":"Add tagging user stories and uses cases to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":16}}},{"hash":"c338510182777bcb57e185e36357e144e4484ea9","isMergeCommit":false,"messageTitle":"Fix typo in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"ziyang27":[{"date":"2024-02-24","commitResults":[{"hash":"841126e514771c7799adf6add5b4e9b897e2f057","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-F13-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"79dddc147247ad7afadbc038ac51939161b4dc54","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"d8755a8ce0da501b1213d00586f3fbc988e3ef47","isMergeCommit":false,"messageTitle":"Update AboutUs page with roles, links, and my own photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":206,"deletions":29}}},{"hash":"0f94b95eb964d474e4efc61816c15fe1c8cd24f4","isMergeCommit":false,"messageTitle":"Update the link of the GitHub Actions build status badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fc06af5416f91c258a5734870b425b3969e8c03e","isMergeCommit":false,"messageTitle":"Update all contents to match our project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":10}}},{"hash":"e5f95669cb1e29ce8dc43e8a64698f60e2f57b44","isMergeCommit":false,"messageTitle":"Remove trailing whitespace","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"7ba95e086f805b8393873c339def0093d0ed41d5","isMergeCommit":false,"messageTitle":"Add the select feature description in the user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":21}}},{"hash":"002a6cbf36aefb1ad0ac92619d0248b5877b9e32","isMergeCommit":false,"messageTitle":"Update developer guide based on our product","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":41,"deletions":11}}}]},{"date":"2024-03-04","commitResults":[{"hash":"ac2334941551de42831912c93de2ca183ce75cd4","isMergeCommit":true,"messageTitle":"Merge pull request #26 from SimHanKiong/branch-AboutUs","messageBody":"Add picture to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"12c2e2ba38a7ab5b20169f6f196bf2f8f0b27475","isMergeCommit":true,"messageTitle":"Merge pull request #27 from SimHanKiong/branch-DeveloperGuide","messageBody":"Add tagging user stories and uses cases to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"dfda9e8caaba03d1280edaef60658fd0cb54a3b5","isMergeCommit":true,"messageTitle":"Merge pull request #28 from SimHanKiong/branch-ReadMe","messageBody":"Fix typo in README.md","fileTypesAndContributionMap":{}},{"hash":"875de1405eb9edc4240e43e9f95acab0744c0416","isMergeCommit":true,"messageTitle":"Merge pull request #29 from SimHanKiong/branch-UserGuide","messageBody":"Add find by tag feature to UserGuide.md","fileTypesAndContributionMap":{}}]}],"Colex2000":[],"tanyunchao":[]},"authorFileTypeContributionMap":{"SimHanKiong":{"docs":114,"functional-code":0,"test-code":0},"ziyang27":{"docs":271,"functional-code":0,"test-code":0},"Colex2000":{"docs":0,"functional-code":0,"test-code":0},"tanyunchao":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"SimHanKiong":1473.1075,"ziyang27":12429.16,"Colex2000":0.0,"tanyunchao":0.0},"authorDisplayNameMap":{"SimHanKiong":"CS2103T-F13-2 SIM ..IONG","ziyang27":"CS2103T-F13-2 TAN ..YANG","Colex2000":"CS2103T-F13-2 TION.. YAO","tanyunchao":"CS2103T-F13-2 TAN ..CHAO"}} +{"authorDailyContributionsMap":{"SimHanKiong":[{"date":"2024-03-03","commitResults":[{"hash":"43ed111253679062e94fa672dbf06472036159a7","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ziyang27/updating-AboutUs-page","messageBody":"Update AboutUs page with roles, links, and my own photo","fileTypesAndContributionMap":{}},{"hash":"08f3796cd552191b7e9ab4a69df135a172229a6c","isMergeCommit":true,"messageTitle":"Merge pull request #15 from ziyang27/updating-README-page","messageBody":"Update readme page","fileTypesAndContributionMap":{}},{"hash":"660434233cc4285402b19c98d246a2270588398b","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"0eef02dd9453968999e4a154bcc4eef0939054a0","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ziyang27/branch-update-UG","messageBody":"Add the select feature description in the user guide","fileTypesAndContributionMap":{}},{"hash":"cf4fe7a047b05ff84e6accc4d67363fbc5056858","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}},{"hash":"ab70f3daaa8f0bf0d3cfb7e32cf06b0bab6331bb","isMergeCommit":true,"messageTitle":"Merge pull request #21 from ziyang27/branch-update-DG","messageBody":"Update developer guide based on our product","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"d0f34f027fbd1dfd1045c74ac18de30ab6bdaa29","isMergeCommit":false,"messageTitle":"Add picture to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"02b3c5adf5a77dd497047d02440ebe74bb903f7e","isMergeCommit":false,"messageTitle":"Add find by tag feature to UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":9}}},{"hash":"6e120c97d4e84183a451e516c2e288218b47b9ad","isMergeCommit":false,"messageTitle":"Add tagging user stories and uses cases to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":16}}},{"hash":"c338510182777bcb57e185e36357e144e4484ea9","isMergeCommit":false,"messageTitle":"Fix typo in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"ziyang27":[{"date":"2024-02-24","commitResults":[{"hash":"841126e514771c7799adf6add5b4e9b897e2f057","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-F13-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"79dddc147247ad7afadbc038ac51939161b4dc54","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"d8755a8ce0da501b1213d00586f3fbc988e3ef47","isMergeCommit":false,"messageTitle":"Update AboutUs page with roles, links, and my own photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":206,"deletions":29}}},{"hash":"0f94b95eb964d474e4efc61816c15fe1c8cd24f4","isMergeCommit":false,"messageTitle":"Update the link of the GitHub Actions build status badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fc06af5416f91c258a5734870b425b3969e8c03e","isMergeCommit":false,"messageTitle":"Update all contents to match our project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":10}}},{"hash":"e5f95669cb1e29ce8dc43e8a64698f60e2f57b44","isMergeCommit":false,"messageTitle":"Remove trailing whitespace","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"7ba95e086f805b8393873c339def0093d0ed41d5","isMergeCommit":false,"messageTitle":"Add the select feature description in the user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":21}}},{"hash":"002a6cbf36aefb1ad0ac92619d0248b5877b9e32","isMergeCommit":false,"messageTitle":"Update developer guide based on our product","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":41,"deletions":11}}}]},{"date":"2024-03-04","commitResults":[{"hash":"ac2334941551de42831912c93de2ca183ce75cd4","isMergeCommit":true,"messageTitle":"Merge pull request #26 from SimHanKiong/branch-AboutUs","messageBody":"Add picture to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"12c2e2ba38a7ab5b20169f6f196bf2f8f0b27475","isMergeCommit":true,"messageTitle":"Merge pull request #27 from SimHanKiong/branch-DeveloperGuide","messageBody":"Add tagging user stories and uses cases to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"dfda9e8caaba03d1280edaef60658fd0cb54a3b5","isMergeCommit":true,"messageTitle":"Merge pull request #28 from SimHanKiong/branch-ReadMe","messageBody":"Fix typo in README.md","fileTypesAndContributionMap":{}},{"hash":"875de1405eb9edc4240e43e9f95acab0744c0416","isMergeCommit":true,"messageTitle":"Merge pull request #29 from SimHanKiong/branch-UserGuide","messageBody":"Add find by tag feature to UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"a9ead0a04ab5f66bfaa10371dc2372f8d300c215","isMergeCommit":true,"messageTitle":"Merge pull request #30 from Colex2000/master","messageBody":"Add profile pic and update AboutUs doc","fileTypesAndContributionMap":{}},{"hash":"1e6f73b9ddceb32ee9cc22c0c9a4c9505f47bfd0","isMergeCommit":true,"messageTitle":"Merge pull request #31 from Colex2000/updateUserGuide","messageBody":"Add tagging last contacted feature in UG and update DG use cases.","fileTypesAndContributionMap":{}}]}],"Colex2000":[{"date":"2024-03-06","commitResults":[{"hash":"61c3c0deada9a9ae25e05db3bed4797ab06bd4e2","isMergeCommit":false,"messageTitle":"Update docs to include profile pic","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"220819cdf0008a2c449827f8d42cf01a27079ff9","isMergeCommit":false,"messageTitle":"Add tagging last contacted feature in UserGuide. Update DeveloperGuide use cases.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":48,"deletions":0}}}]}],"tanyunchao":[]},"authorFileTypeContributionMap":{"SimHanKiong":{"docs":114,"functional-code":0,"test-code":0},"ziyang27":{"docs":271,"functional-code":0,"test-code":0},"Colex2000":{"docs":48,"functional-code":0,"test-code":0},"tanyunchao":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"SimHanKiong":1278.6744,"ziyang27":10680.615,"Colex2000":177.5148,"tanyunchao":0.0},"authorDisplayNameMap":{"SimHanKiong":"CS2103T-F13-2 SIM ..IONG","ziyang27":"CS2103T-F13-2 TAN ..YANG","Colex2000":"CS2103T-F13-2 TION.. YAO","tanyunchao":"CS2103T-F13-2 TAN ..CHAO"}} diff --git a/AY2324S2-CS2103T-F14-2_tp_master/authorship.json b/AY2324S2-CS2103T-F14-2_tp_master/authorship.json index 30178b55..ef19ad1b 100644 --- a/AY2324S2-CS2103T-F14-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F14-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tengcharmaine"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F14-2/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-F14-2/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F14-2/tp/graph/badge.svg?token\u003dT5H5FY1BYS)](https://codecov.io/gh/AY2324S2-CS2103T-F14-2/tp)","lastModifiedDate":"2024-02-20"},{"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":"tengcharmaine"},"content":"The project simulates an ongoing software project for a desktop application (called _Clinic Mate_) used for managing contact details.","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"tengcharmaine"},"content":"* It is **written in OOP fashion**. It provides a **reasonably well-written** code base.","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"tengcharmaine"},"content":"Clinic Mate is an **address book for managing user\u0027s contacts, optimised for use via a Command Line Interface** (CLI) while","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"tengcharmaine"},"content":"still having the benefits of a Graphical User Interface (GUI).","lastModifiedDate":"2024-03-03"},{"lineNumber":12,"author":{"gitId":"tengcharmaine"},"content":"If you can type fast, Clinic Mate can manage your contacts faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":14,"author":{"gitId":"tengcharmaine"},"content":"Clinic Mate aims to make it easy for **General Practitioners** (GPs) in private family clinics to view patient contacts at","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"tengcharmaine"},"content":"a glance including:","lastModifiedDate":"2024-03-03"},{"lineNumber":16,"author":{"gitId":"tengcharmaine"},"content":"* Medical history","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"tengcharmaine"},"content":"* Past diagnosis","lastModifiedDate":"2024-03-03"},{"lineNumber":18,"author":{"gitId":"tengcharmaine"},"content":"* Prescriptions","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"tengcharmaine"},"content":"* Future appointments","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"tengcharmaine"},"content":"* Many more","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":22,"author":{"gitId":"tengcharmaine"},"content":"For the detailed documentation of this project (e.g. User or Developer Guide), see the **[Clinic Mate Website](https://ay2324s2-cs2103t-f14-2.github.io/tp/)**.","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":24,"author":{"gitId":"tengcharmaine"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"tengcharmaine":19,"-":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":"jiahui0309"},"content":"You can reach us at the email `e0970466@comp.nus.edu.sg`","lastModifiedDate":"2024-03-03"},{"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":"jiahui0309"},"content":"### Yeo Jun Teng Drustan","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/drustanyjt.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"jiahui0309"},"content":"[[github](https://github.com/drustanyjt)]","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"jiahui0309"},"content":"[[linkedin](https://www.linkedin.com/in/drustan/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jiahui0309"},"content":"### Chen Jiaying Jayne","lastModifiedDate":"2024-03-03"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/jayne1010.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jiahui0309"},"content":"[[github](http://github.com/Jayne1010)]","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"jiahui0309"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-03"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"jiahui0309"},"content":"### Song Jia Hui","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/jiahui0309.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"jiahui0309"},"content":"[[github](http://github.com/jiahui0309)]","lastModifiedDate":"2024-03-03"},{"lineNumber":37,"author":{"gitId":"jiahui0309"},"content":"[[linkedin](https://www.linkedin.com/in/song-jia-hui/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"jiahui0309"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"jiahui0309"},"content":"### Teng Shi Rou Charmaine","lastModifiedDate":"2024-03-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/tengcharmaine.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"jiahui0309"},"content":"[[github](http://github.com/tengcharmaine)]","lastModifiedDate":"2024-03-03"},{"lineNumber":47,"author":{"gitId":"jiahui0309"},"content":"[[linkedin](https://www.linkedin.com/in/charmaine-teng/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","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":"jiahui0309"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"-":32,"jiahui0309":19}},{"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":"drustanyjt"},"content":"# ClinicMate Developer Guide","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"jiahui0309"},"content":"(For all use cases below, the **System** is the `ClinicMate` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"jiahui0309"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"jiahui0309"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"jiahui0309"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"jiahui0309"},"content":"3. User requests to add a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate adds the person","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"jiahui0309"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"jiahui0309"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"jiahui0309"},"content":"* 3a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"jiahui0309"},"content":"* 4a. There is an existing user in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":331,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"jiahui0309"},"content":"**Use case: Add notes for a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"jiahui0309"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"jiahui0309"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"jiahui0309"},"content":"3. User requests to add notes for a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate adds notes for the person","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"jiahui0309"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"jiahui0309"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"jiahui0309"},"content":"* 3a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"jiahui0309"},"content":"* 4a. The given IC number is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate deletes the person","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"jiahui0309"},"content":"* 3a. The given IC number is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"jiahui0309"},"content":"* 4a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"jiahui0309"},"content":"**Use case: Find a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"jiahui0309"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"jiahui0309"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"jiahui0309"},"content":"3. User requests to find a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate finds the person","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":403,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":404,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"jiahui0309"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"jiahui0309"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"jiahui0309"},"content":"* 3a. The given IC number is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"jiahui0309"},"content":"* 4a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"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":428,"author":{"gitId":"tengcharmaine"},"content":"2. 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-03"},{"lineNumber":429,"author":{"gitId":"tengcharmaine"},"content":"3. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":430,"author":{"gitId":"tengcharmaine"},"content":"4. Should respond to user actions within 5 seconds under normal load conditions.","lastModifiedDate":"2024-03-03"},{"lineNumber":431,"author":{"gitId":"tengcharmaine"},"content":"5. Should be designed to use system resources (e.g. CPU) efficiently to minimise its impact on the host environment.","lastModifiedDate":"2024-03-03"},{"lineNumber":432,"author":{"gitId":"tengcharmaine"},"content":"6. User interface should be intuitive and easy for users with varying levels of technical expertise.","lastModifiedDate":"2024-03-03"},{"lineNumber":433,"author":{"gitId":"tengcharmaine"},"content":"7. Codebase should be well-documented and follow best practices to facilitate future maintenance and enhancements.","lastModifiedDate":"2024-03-03"},{"lineNumber":434,"author":{"gitId":"tengcharmaine"},"content":"8. Should be easy for developers to add new features or make changes to existing ones without causing unintended side effects.","lastModifiedDate":"2024-03-03"},{"lineNumber":435,"author":{"gitId":"tengcharmaine"},"content":"9. Should comply with relevant data privacy regulations (e.g. PDPA) and ensure user data is stored and processed securely.","lastModifiedDate":"2024-03-03"},{"lineNumber":436,"author":{"gitId":"tengcharmaine"},"content":"10. Should be able to be used alongside other systems and services commonly used in healthcare settings, such as electronic health record (EHR) systems.","lastModifiedDate":"2024-03-03"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":441,"author":{"gitId":"drustanyjt"},"content":"* **GP**: General Practitioner, a general physician who provides primary care (usually in a clinic)","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"drustanyjt"},"content":"* **Taking History**: A medical term for recording a patient\u0027s symptoms, medical history, and other relevant information","lastModifiedDate":"2024-03-04"},{"lineNumber":443,"author":{"gitId":"drustanyjt"},"content":"* **Differential Diagnosis**: A medical term for a possible alternative diagnosis for a patient\u0027s symptoms","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"drustanyjt"},"content":"* **IC Number**: Short for NRIC (National Registration Identity Card) Number, a unique identifier for Singapore citizens and permanent residents","lastModifiedDate":"2024-03-05"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":454,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":455,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"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":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"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":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"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":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"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":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"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":489,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"drustanyjt":5,"tengcharmaine":9,"-":388,"jiahui0309":97}},{"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":"Jayne1010"},"content":"# Clinic Mate User Guide","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Jayne1010"},"content":"Clinic Mate is a **desktop** app for managing contacts in a clinic, 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, Clinic Mate can manage your patients\u0027 contact faster than traditional GUI apps.","lastModifiedDate":"2024-03-05"},{"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":"tengcharmaine"},"content":" ![Ui](images/OldUi.png)","lastModifiedDate":"2024-03-03"},{"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":"Jayne1010"},"content":" * `add n/John Doe i/T0123456A ag/12 s/Male a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2024-03-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jayne1010"},"content":" * `delete T0123456A` : Deletes the contact with the IC \u0027T0123456A\u0027 shown in the current list.","lastModifiedDate":"2024-03-03"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"Jayne1010"},"content":" * `find T0123456A` : Find the contact with the IC \u0027T0123456A\u0027 shown in the current list.","lastModifiedDate":"2024-03-03"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jayne1010"},"content":" * `addnote i/T0123456A n/Patient has diabetes` : Add a note: \u0027Patient has diabetes\u0027 for the contact with the IC \u0027T0123456A\u0027 as shown in current list.","lastModifiedDate":"2024-03-05"},{"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":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Jayne1010"},"content":" e.g. if the command specifies `n/NAME i/IC_NUMBER`, `i/IC_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"Jayne1010"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"Jayne1010"},"content":"Format: `add n/NAME i/IC_NUMBER ag/AGE s/SEX a/ADDRESS`","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":80,"author":{"gitId":"Jayne1010"},"content":"**Tip:** A person can have a note included.","lastModifiedDate":"2024-03-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"Jayne1010"},"content":"* `add n/John Doe i/T0123456A ag/12 s/Male a/John street, block 123, #01-01`","lastModifiedDate":"2024-03-03"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"Jayne1010"},"content":"### Adding a note : `addnote`","lastModifiedDate":"2024-03-03"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"Jayne1010"},"content":"Add a note to an existing person in the address book","lastModifiedDate":"2024-03-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"Jayne1010"},"content":"Format: `addnote i/IC_NUMBER n/NOTE`","lastModifiedDate":"2024-03-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"Jayne1010"},"content":"* Adds a note to the person with the specified `IC_NUMBER`. The IC number refers to the IC number shown in the displayed person list. The IC_NUMBER **must be the FULL IC NUMBER**.","lastModifiedDate":"2024-03-03"},{"lineNumber":93,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"Jayne1010"},"content":"* When adding notes, the new note added will be appended to the current note of the person. i.e. current note is preserved","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"Jayne1010"},"content":"* `addnote i/T0123456A n/Patient has diabetes` Adds a note `Patient has diabetes` to the person with the IC number `T0123456A` in the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"Jayne1010"},"content":"### Locating persons by ic number: `find`","lastModifiedDate":"2024-03-03"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"Jayne1010"},"content":"Find an existing person in the address book using their IC_NUMBER.","lastModifiedDate":"2024-03-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"Jayne1010"},"content":"Format: `find IC_NUMBER`","lastModifiedDate":"2024-03-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"Jayne1010"},"content":"* The search is case-insensitive. e.g `t0123456a` will match `T0123456A`.","lastModifiedDate":"2024-03-03"},{"lineNumber":106,"author":{"gitId":"Jayne1010"},"content":"* Only the IC number is searched.","lastModifiedDate":"2024-03-03"},{"lineNumber":107,"author":{"gitId":"Jayne1010"},"content":"* Only full IC number will be matched e.g. `T0123456A` will not match `T0123A`.","lastModifiedDate":"2024-03-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"Jayne1010"},"content":"* `find T0123456A` returns `John Doe`.","lastModifiedDate":"2024-03-03"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"Jayne1010"},"content":"Deletes the specified person from the address book using their IC_NUMBER.","lastModifiedDate":"2024-03-03"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"Jayne1010"},"content":"Format: `delete IC_NUMBER`","lastModifiedDate":"2024-03-03"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"Jayne1010"},"content":"* Deletes the person with the specified `IC_NUMBER`.","lastModifiedDate":"2024-03-03"},{"lineNumber":119,"author":{"gitId":"Jayne1010"},"content":"* The IC_NUMBER refers to the IC number shown in the displayed person list.","lastModifiedDate":"2024-03-03"},{"lineNumber":120,"author":{"gitId":"Jayne1010"},"content":"* The IC_NUMBER **must be the FULL IC NUMBER**.","lastModifiedDate":"2024-03-03"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"Jayne1010"},"content":"* `delete T0123456A` deletes `John Doe` from the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"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":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":143,"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":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":145,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":147,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":148,"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":149,"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":150,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":152,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"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":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":167,"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":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":175,"author":{"gitId":"Jayne1010"},"content":"**Add** | `add n/NAME i/IC_NUMBER ag/AGE s/SEX a/ADDRESS` \u003cbr\u003e e.g., `add n/John Doe i/T0123456A ag/12 s/Male a/John street, block 123, #01-01`","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"Jayne1010"},"content":"**Delete** | `delete IC_NUMBER`\u003cbr\u003e e.g., `delete T0123456A`","lastModifiedDate":"2024-03-03"},{"lineNumber":178,"author":{"gitId":"Jayne1010"},"content":"**AddNote** | `addnote i/IC_NUMBER n/NOTE`\u003cbr\u003e e.g., `addnote i/T0123456A n/Patient has diabetes`","lastModifiedDate":"2024-03-03"},{"lineNumber":179,"author":{"gitId":"Jayne1010"},"content":"**Find** | `find IC_NUMBER`\u003cbr\u003e e.g., `find T0123456A`","lastModifiedDate":"2024-03-03"},{"lineNumber":180,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Jayne1010":34,"tengcharmaine":1,"-":145}},{"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":"-"},"content":"# AddressBook Level-3","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"tengcharmaine"},"content":"![Ui](images/OldUi.png)","lastModifiedDate":"2024-03-03"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"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":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":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"},{"lineNumber":22,"author":{"gitId":"drustanyjt"},"content":"* Logo: [Red Cross icons by Freepik - Flaticon](https://www.flaticon.com/free-icons/red-cross)","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"drustanyjt"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"drustanyjt":2,"tengcharmaine":1,"-":20}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tengcharmaine"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F14-2/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-F14-2/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F14-2/tp/graph/badge.svg?token\u003dT5H5FY1BYS)](https://codecov.io/gh/AY2324S2-CS2103T-F14-2/tp)","lastModifiedDate":"2024-02-20"},{"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":"tengcharmaine"},"content":"The project simulates an ongoing software project for a desktop application (called _Clinic Mate_) used for managing contact details.","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"tengcharmaine"},"content":"* It is **written in OOP fashion**. It provides a **reasonably well-written** code base.","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"tengcharmaine"},"content":"Clinic Mate is an **address book for managing user\u0027s contacts, optimised for use via a Command Line Interface** (CLI) while","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"tengcharmaine"},"content":"still having the benefits of a Graphical User Interface (GUI).","lastModifiedDate":"2024-03-03"},{"lineNumber":12,"author":{"gitId":"tengcharmaine"},"content":"If you can type fast, Clinic Mate can manage your contacts faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":14,"author":{"gitId":"tengcharmaine"},"content":"Clinic Mate aims to make it easy for **General Practitioners** (GPs) in private family clinics to view patient contacts at","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"tengcharmaine"},"content":"a glance including:","lastModifiedDate":"2024-03-03"},{"lineNumber":16,"author":{"gitId":"tengcharmaine"},"content":"* Medical history","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"tengcharmaine"},"content":"* Past diagnosis","lastModifiedDate":"2024-03-03"},{"lineNumber":18,"author":{"gitId":"tengcharmaine"},"content":"* Prescriptions","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"tengcharmaine"},"content":"* Future appointments","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"tengcharmaine"},"content":"* Many more","lastModifiedDate":"2024-03-03"},{"lineNumber":21,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":22,"author":{"gitId":"tengcharmaine"},"content":"For the detailed documentation of this project (e.g. User or Developer Guide), see the **[Clinic Mate Website](https://ay2324s2-cs2103t-f14-2.github.io/tp/)**.","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"tengcharmaine"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":24,"author":{"gitId":"tengcharmaine"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"tengcharmaine":19,"-":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":"jiahui0309"},"content":"You can reach us at the email `e0970466@comp.nus.edu.sg`","lastModifiedDate":"2024-03-03"},{"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":"jiahui0309"},"content":"### Yeo Jun Teng Drustan","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/drustanyjt.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"jiahui0309"},"content":"[[github](https://github.com/drustanyjt)]","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"jiahui0309"},"content":"[[linkedin](https://www.linkedin.com/in/drustan/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jiahui0309"},"content":"### Chen Jiaying Jayne","lastModifiedDate":"2024-03-03"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/jayne1010.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jiahui0309"},"content":"[[github](http://github.com/Jayne1010)]","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"jiahui0309"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-03-03"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"jiahui0309"},"content":"### Song Jia Hui","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/jiahui0309.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"jiahui0309"},"content":"[[github](http://github.com/jiahui0309)]","lastModifiedDate":"2024-03-03"},{"lineNumber":37,"author":{"gitId":"jiahui0309"},"content":"[[linkedin](https://www.linkedin.com/in/song-jia-hui/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"jiahui0309"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"jiahui0309"},"content":"### Teng Shi Rou Charmaine","lastModifiedDate":"2024-03-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"jiahui0309"},"content":"\u003cimg src\u003d\"images/tengcharmaine.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"jiahui0309"},"content":"[[github](http://github.com/tengcharmaine)]","lastModifiedDate":"2024-03-03"},{"lineNumber":47,"author":{"gitId":"jiahui0309"},"content":"[[linkedin](https://www.linkedin.com/in/charmaine-teng/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","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":"jiahui0309"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"-":32,"jiahui0309":19}},{"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":"drustanyjt"},"content":"# ClinicMate Developer Guide","lastModifiedDate":"2024-03-05"},{"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":"drustanyjt"},"content":"* General Practitioners working in their own private GP Clinics","lastModifiedDate":"2024-03-06"},{"lineNumber":278,"author":{"gitId":"drustanyjt"},"content":"* short staffed with minimal assistants for administrative tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"drustanyjt"},"content":"* annoyed by relying on pen and paper to track patient contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"drustanyjt"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2024-03-06"},{"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":"drustanyjt"},"content":"**Value proposition**: Quick and easy management of patient contacts, including important patient information.","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":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"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":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"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":298,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"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":"jiahui0309"},"content":"(For all use cases below, the **System** is the `ClinicMate` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"jiahui0309"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"jiahui0309"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"jiahui0309"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"jiahui0309"},"content":"3. User requests to add a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate adds the person","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"jiahui0309"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"jiahui0309"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"jiahui0309"},"content":"* 3a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"jiahui0309"},"content":"* 4a. There is an existing user in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"jiahui0309"},"content":"**Use case: Add notes for a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"jiahui0309"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"jiahui0309"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"jiahui0309"},"content":"3. User requests to add notes for a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate adds notes for the person","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"jiahui0309"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"jiahui0309"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"jiahui0309"},"content":"* 3a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"jiahui0309"},"content":"* 4a. The given IC number is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate deletes the person","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"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":"jiahui0309"},"content":"* 3a. The given IC number is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"jiahui0309"},"content":"* 4a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"jiahui0309"},"content":"**Use case: Find a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"jiahui0309"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"jiahui0309"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"jiahui0309"},"content":"2. ClinicMate shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"jiahui0309"},"content":"3. User requests to find a specific person in the list","lastModifiedDate":"2024-03-04"},{"lineNumber":403,"author":{"gitId":"jiahui0309"},"content":"4. ClinicMate finds the person","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"jiahui0309"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"jiahui0309"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"jiahui0309"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"jiahui0309"},"content":"* 3a. The given IC number is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"jiahui0309"},"content":" * 3a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"jiahui0309"},"content":"* 4a. The given command format is wrong.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"jiahui0309"},"content":" * 4a1. ClinicMate shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"jiahui0309"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":425,"author":{"gitId":"jiahui0309"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"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":430,"author":{"gitId":"tengcharmaine"},"content":"2. 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-03"},{"lineNumber":431,"author":{"gitId":"tengcharmaine"},"content":"3. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":432,"author":{"gitId":"tengcharmaine"},"content":"4. Should respond to user actions within 5 seconds under normal load conditions.","lastModifiedDate":"2024-03-03"},{"lineNumber":433,"author":{"gitId":"tengcharmaine"},"content":"5. Should be designed to use system resources (e.g. CPU) efficiently to minimise its impact on the host environment.","lastModifiedDate":"2024-03-03"},{"lineNumber":434,"author":{"gitId":"tengcharmaine"},"content":"6. User interface should be intuitive and easy for users with varying levels of technical expertise.","lastModifiedDate":"2024-03-03"},{"lineNumber":435,"author":{"gitId":"tengcharmaine"},"content":"7. Codebase should be well-documented and follow best practices to facilitate future maintenance and enhancements.","lastModifiedDate":"2024-03-03"},{"lineNumber":436,"author":{"gitId":"tengcharmaine"},"content":"8. Should be easy for developers to add new features or make changes to existing ones without causing unintended side effects.","lastModifiedDate":"2024-03-03"},{"lineNumber":437,"author":{"gitId":"tengcharmaine"},"content":"9. Should comply with relevant data privacy regulations (e.g. PDPA) and ensure user data is stored and processed securely.","lastModifiedDate":"2024-03-03"},{"lineNumber":438,"author":{"gitId":"tengcharmaine"},"content":"10. Should be able to be used alongside other systems and services commonly used in healthcare settings, such as electronic health record (EHR) systems.","lastModifiedDate":"2024-03-03"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":443,"author":{"gitId":"drustanyjt"},"content":"* **GP**: General Practitioner, a general physician who provides primary care (usually in a clinic)","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"drustanyjt"},"content":"* **Taking History**: A medical term for recording a patient\u0027s symptoms, medical history, and other relevant information","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"drustanyjt"},"content":"* **Differential Diagnosis**: A medical term for a possible alternative diagnosis for a patient\u0027s symptoms","lastModifiedDate":"2024-03-04"},{"lineNumber":446,"author":{"gitId":"drustanyjt"},"content":"* **IC Number**: Short for NRIC (National Registration Identity Card) Number, a unique identifier for Singapore citizens and permanent residents","lastModifiedDate":"2024-03-05"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":456,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":457,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"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":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"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":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"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":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"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":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"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":491,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"drustanyjt":10,"tengcharmaine":9,"-":385,"jiahui0309":97}},{"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":"Jayne1010"},"content":"# Clinic Mate User Guide","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Jayne1010"},"content":"Clinic Mate is a **desktop** app for managing contacts in a clinic, 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, Clinic Mate can manage your patients\u0027 contact faster than traditional GUI apps.","lastModifiedDate":"2024-03-05"},{"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":"tengcharmaine"},"content":"1. Download the latest `clinicmate.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-03-06"},{"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":"tengcharmaine"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar clinicmate.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"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":"2024-03-06"},{"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":"Jayne1010"},"content":" * `add n/John Doe i/T0123456A ag/12 s/Male a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2024-03-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jayne1010"},"content":" * `delete T0123456A` : Deletes the contact with the IC \u0027T0123456A\u0027 shown in the current list.","lastModifiedDate":"2024-03-03"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"Jayne1010"},"content":" * `find T0123456A` : Find the contact with the IC \u0027T0123456A\u0027 shown in the current list.","lastModifiedDate":"2024-03-03"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jayne1010"},"content":" * `addnote i/T0123456A n/Patient has diabetes` : Add a note: \u0027Patient has diabetes\u0027 for the contact with the IC \u0027T0123456A\u0027 as shown in current list.","lastModifiedDate":"2024-03-05"},{"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":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Jayne1010"},"content":" e.g. if the command specifies `n/NAME i/IC_NUMBER`, `i/IC_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2023-06-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"Jayne1010"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-03-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"Jayne1010"},"content":"Format: `add n/NAME i/IC_NUMBER ag/AGE s/SEX a/ADDRESS`","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":80,"author":{"gitId":"Jayne1010"},"content":"**Tip:** A person can have a note included.","lastModifiedDate":"2024-03-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"Jayne1010"},"content":"* `add n/John Doe i/T0123456A ag/12 s/Male a/John street, block 123, #01-01`","lastModifiedDate":"2024-03-03"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"Jayne1010"},"content":"### Adding a note : `addnote`","lastModifiedDate":"2024-03-03"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"Jayne1010"},"content":"Add a note to an existing person in the address book","lastModifiedDate":"2024-03-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"Jayne1010"},"content":"Format: `addnote i/IC_NUMBER n/NOTE`","lastModifiedDate":"2024-03-03"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"Jayne1010"},"content":"* Adds a note to the person with the specified `IC_NUMBER`. The IC number refers to the IC number shown in the displayed person list. The IC_NUMBER **must be the FULL IC NUMBER**.","lastModifiedDate":"2024-03-03"},{"lineNumber":93,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"Jayne1010"},"content":"* When adding notes, the new note added will be appended to the current note of the person. i.e. current note is preserved","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"Jayne1010"},"content":"* `addnote i/T0123456A n/Patient has diabetes` Adds a note `Patient has diabetes` to the person with the IC number `T0123456A` in the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"Jayne1010"},"content":"### Locating persons by ic number: `find`","lastModifiedDate":"2024-03-03"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"Jayne1010"},"content":"Find an existing person in the address book using their IC_NUMBER.","lastModifiedDate":"2024-03-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"Jayne1010"},"content":"Format: `find IC_NUMBER`","lastModifiedDate":"2024-03-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"Jayne1010"},"content":"* The search is case-insensitive. e.g `t0123456a` will match `T0123456A`.","lastModifiedDate":"2024-03-03"},{"lineNumber":106,"author":{"gitId":"Jayne1010"},"content":"* Only the IC number is searched.","lastModifiedDate":"2024-03-03"},{"lineNumber":107,"author":{"gitId":"Jayne1010"},"content":"* Only full IC number will be matched e.g. `T0123456A` will not match `T0123A`.","lastModifiedDate":"2024-03-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"Jayne1010"},"content":"* `find T0123456A` returns `John Doe`.","lastModifiedDate":"2024-03-03"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"Jayne1010"},"content":"Deletes the specified person from the address book using their IC_NUMBER.","lastModifiedDate":"2024-03-03"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"Jayne1010"},"content":"Format: `delete IC_NUMBER`","lastModifiedDate":"2024-03-03"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"Jayne1010"},"content":"* Deletes the person with the specified `IC_NUMBER`.","lastModifiedDate":"2024-03-03"},{"lineNumber":119,"author":{"gitId":"Jayne1010"},"content":"* The IC_NUMBER refers to the IC number shown in the displayed person list.","lastModifiedDate":"2024-03-03"},{"lineNumber":120,"author":{"gitId":"Jayne1010"},"content":"* The IC_NUMBER **must be the FULL IC NUMBER**.","lastModifiedDate":"2024-03-03"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"Jayne1010"},"content":"* `delete T0123456A` deletes `John Doe` from the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"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":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":143,"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":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":145,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":147,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":148,"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":149,"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":150,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":152,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"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":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":167,"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":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":175,"author":{"gitId":"Jayne1010"},"content":"**Add** | `add n/NAME i/IC_NUMBER ag/AGE s/SEX a/ADDRESS` \u003cbr\u003e e.g., `add n/John Doe i/T0123456A ag/12 s/Male a/John street, block 123, #01-01`","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"Jayne1010"},"content":"**Delete** | `delete IC_NUMBER`\u003cbr\u003e e.g., `delete T0123456A`","lastModifiedDate":"2024-03-03"},{"lineNumber":178,"author":{"gitId":"Jayne1010"},"content":"**AddNote** | `addnote i/IC_NUMBER n/NOTE`\u003cbr\u003e e.g., `addnote i/T0123456A n/Patient has diabetes`","lastModifiedDate":"2024-03-03"},{"lineNumber":179,"author":{"gitId":"Jayne1010"},"content":"**Find** | `find IC_NUMBER`\u003cbr\u003e e.g., `find T0123456A`","lastModifiedDate":"2024-03-03"},{"lineNumber":180,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Jayne1010":34,"tengcharmaine":2,"-":144}},{"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":"jiahui0309"},"content":"# ClinicMate Level-3","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"tengcharmaine"},"content":"![Ui](images/OldUi.png)","lastModifiedDate":"2024-03-03"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"jiahui0309"},"content":"**ClinicMate 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-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"jiahui0309"},"content":"* If you are interested in using ClinicMate, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jiahui0309"},"content":"* If you are interested about developing ClinicMate, 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":"-"},"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":22,"author":{"gitId":"drustanyjt"},"content":"* Logo: [Red Cross icons by Freepik - Flaticon](https://www.flaticon.com/free-icons/red-cross)","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"drustanyjt"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"drustanyjt":2,"tengcharmaine":1,"-":16,"jiahui0309":4}}] diff --git a/AY2324S2-CS2103T-F14-2_tp_master/commits.json b/AY2324S2-CS2103T-F14-2_tp_master/commits.json index 453bf1be..272955d2 100644 --- a/AY2324S2-CS2103T-F14-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-F14-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"drustanyjt":[{"date":"2024-03-03","commitResults":[{"hash":"e054773e7feb575fd00e7ac063510ae83d2c94d1","isMergeCommit":false,"messageTitle":"Update sitewide settings with product name and new logo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"6b2d0514ccfe445f72ff94a09eff0e80b023a14c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into docs-sitewide-settings","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3da4848193c31724810f138e9ca4ecc699b5622c","isMergeCommit":true,"messageTitle":"Merge pull request #20 from drustanyjt/docs-sitewide-settings","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"863ee95c9fdb7c1212b802c562b4d0c47b9c75d0","isMergeCommit":false,"messageTitle":"Add medical terms in meeting notes to glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":2}}},{"hash":"8490e739aea7f07a72a320c62382da7316e982d5","isMergeCommit":false,"messageTitle":"Fix whitespace errors","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-05","commitResults":[{"hash":"3936397f7fb177dbeb1099057ef0dd76c36f00de","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"Jayne1010":[{"date":"2024-03-05","commitResults":[{"hash":"5c3b512b4437b7dbc40a12f81d2a5f2c4043d612","isMergeCommit":false,"messageTitle":"Update user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":58}}},{"hash":"474dc32baa8f98a1a8bcbf3df39a6e78e83f1d2d","isMergeCommit":false,"messageTitle":"Update UG with minor typo fix","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8a95434394c4826dbd915f7d99bdb060ed2ea7aa","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"bccedcb53f202203ade98150652a325be001ba04","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"80c59a32e3f398301150979761ec4f763903e5f0","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ae0360ebd33544f6c1b1b14bc94e972a998f48f5","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"25b35b33296660a59dfebfe6c7c75df99957da4f","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":58}}},{"hash":"e6ef73be1f8c8973daa5432b782e0115a35d3945","isMergeCommit":false,"messageTitle":"Update DG v1.1","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":9}}},{"hash":"8ef12faa0943d2dfcd686f934b30f37ee98b8ad4","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"a848745810b23913f65038b592963a9ba03b4d72","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"62eceedef59ac84b48a8dfdf17b5e857dfaf23b7","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"90d19984cb50ddf3faa74ac2182f8724cf041efb","isMergeCommit":true,"messageTitle":"Merge pull request #26 from Jayne1010/Updated-DG-v1.1","messageBody":"Update dg v1.1","fileTypesAndContributionMap":{}},{"hash":"c9d0294eb50bbd3d051ef812fc30db401db1a632","isMergeCommit":false,"messageTitle":"Revert \"Update dg v1.1\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":67,"deletions":46}}},{"hash":"44d87616ec6b8d546d083f15578cb65e6fa586fb","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-F14-2/revert-26-Updated-DG-v1.1","messageBody":"Revert \"Update dg v1.1\"","fileTypesAndContributionMap":{}},{"hash":"46d4d35070797256cbf1a01fb7a6bb5cb07954a2","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"349d3530bc407f12ef6316292df677f7da1ea3ed","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"tengcharmaine":[{"date":"2024-03-03","commitResults":[{"hash":"6adfcc34a784f13ffc31553c6973dadbb80cac88","isMergeCommit":false,"messageTitle":"Update Ui mockup png to the new Ui mockup in readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"1486ea0ef2a180512c5976509554d75ef28089dd","isMergeCommit":false,"messageTitle":"Update readme docs for Clinic Mate from original docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":10}}},{"hash":"6e06e4ea3678473438cca55efac61b95ed58ecbf","isMergeCommit":false,"messageTitle":"Fix errors from github checks","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"19bf42edea40495ac4119f43eb631d4c62b37073","isMergeCommit":false,"messageTitle":"Update CI status badge to reflect build status of teams repo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"633a23989c72c88bc8f67cdfd1334c35eb009fa0","isMergeCommit":false,"messageTitle":"Update non-functional requirements (NFRs) to developers guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":5}}},{"hash":"6e1c8f60919f274804a665135aa7ee90348f57b0","isMergeCommit":true,"messageTitle":"Merge pull request #24 from tengcharmaine/update-readme","messageBody":"Update Project README","fileTypesAndContributionMap":{}},{"hash":"922bfe9ea876da86da32caebe1932565f064f5b4","isMergeCommit":true,"messageTitle":"Merge pull request #25 from tengcharmaine/update_NFR","messageBody":"Update non-functional requirements (NFRs) to developers guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"46d097d2b310c08dd298e62dc545ff12a54644de","isMergeCommit":true,"messageTitle":"Merge pull request #27 from Jayne1010/Updated-UG-v1.1","messageBody":"Update ug v1.1","fileTypesAndContributionMap":{}}]}],"jiahui0309":[{"date":"2024-03-03","commitResults":[{"hash":"be650b34b7753172421b5ac7dc1b96999429bb1c","isMergeCommit":false,"messageTitle":"Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":29}}},{"hash":"d7d233883734a9e0bcc21f4991fc8f820a6ba874","isMergeCommit":false,"messageTitle":"Update About Us from feedbacks","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}},{"hash":"c363de2811d3fd0a4d3110b9047eee86e9232c22","isMergeCommit":true,"messageTitle":"Merge pull request #19 from jiahui0309/update-about-us","messageBody":"Update About Us","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"9a969a3bb60e72dcfaf0bc6d755408e91f78fe54","isMergeCommit":false,"messageTitle":"Update DG usecase","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":2}}}]},{"date":"2024-03-05","commitResults":[{"hash":"f06e933edb533409ab4cce2c551b975a0b604bd2","isMergeCommit":false,"messageTitle":"Update DG usecase from comments","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}},{"hash":"f2831f7e8d61abdedfb24b7ebd72b5e7fcafd917","isMergeCommit":true,"messageTitle":"Merge pull request #29 from drustanyjt/docs-dg-glossary","messageBody":"Add medical terms in meeting notes to glossary","fileTypesAndContributionMap":{}},{"hash":"4e8320caaaf9ba28f09b91f32975fa292a0f96af","isMergeCommit":true,"messageTitle":"Merge pull request #28 from jiahui0309/update-dg-usecase","messageBody":"Update DG usecase","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"drustanyjt":{"docs":7,"functional-code":0,"test-code":0},"Jayne1010":{"docs":34,"functional-code":0,"test-code":0},"tengcharmaine":{"docs":30,"functional-code":0,"test-code":0},"jiahui0309":{"docs":116,"functional-code":0,"test-code":0}},"authorContributionVariance":{"drustanyjt":9.743055,"Jayne1010":8624.0,"tengcharmaine":239.55554,"jiahui0309":947.3542},"authorDisplayNameMap":{"drustanyjt":"CS2103T-F14-2 YEO ..STAN","Jayne1010":"CS2103T-F14-2 CHEN..AYNE","tengcharmaine":"CS2103T-F14-2 TENG..AINE","jiahui0309":"CS2103T-F14-2 SONG.. HUI"}} +{"authorDailyContributionsMap":{"drustanyjt":[{"date":"2024-03-03","commitResults":[{"hash":"e054773e7feb575fd00e7ac063510ae83d2c94d1","isMergeCommit":false,"messageTitle":"Update sitewide settings with product name and new logo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"6b2d0514ccfe445f72ff94a09eff0e80b023a14c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into docs-sitewide-settings","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3da4848193c31724810f138e9ca4ecc699b5622c","isMergeCommit":true,"messageTitle":"Merge pull request #20 from drustanyjt/docs-sitewide-settings","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"863ee95c9fdb7c1212b802c562b4d0c47b9c75d0","isMergeCommit":false,"messageTitle":"Add medical terms in meeting notes to glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":2}}},{"hash":"8490e739aea7f07a72a320c62382da7316e982d5","isMergeCommit":false,"messageTitle":"Fix whitespace errors","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-05","commitResults":[{"hash":"3936397f7fb177dbeb1099057ef0dd76c36f00de","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"467d54beba603f8ee15c03f015b90ec4eadc35fa","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Added value proposition and user profile.","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":3}}}]}],"Jayne1010":[{"date":"2024-03-05","commitResults":[{"hash":"5c3b512b4437b7dbc40a12f81d2a5f2c4043d612","isMergeCommit":false,"messageTitle":"Update user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":58}}},{"hash":"474dc32baa8f98a1a8bcbf3df39a6e78e83f1d2d","isMergeCommit":false,"messageTitle":"Update UG with minor typo fix","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"8a95434394c4826dbd915f7d99bdb060ed2ea7aa","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"bccedcb53f202203ade98150652a325be001ba04","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"80c59a32e3f398301150979761ec4f763903e5f0","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ae0360ebd33544f6c1b1b14bc94e972a998f48f5","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"25b35b33296660a59dfebfe6c7c75df99957da4f","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":58}}},{"hash":"e6ef73be1f8c8973daa5432b782e0115a35d3945","isMergeCommit":false,"messageTitle":"Update DG v1.1","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":9}}},{"hash":"8ef12faa0943d2dfcd686f934b30f37ee98b8ad4","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"a848745810b23913f65038b592963a9ba03b4d72","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"62eceedef59ac84b48a8dfdf17b5e857dfaf23b7","isMergeCommit":false,"messageTitle":"Update DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"90d19984cb50ddf3faa74ac2182f8724cf041efb","isMergeCommit":true,"messageTitle":"Merge pull request #26 from Jayne1010/Updated-DG-v1.1","messageBody":"Update dg v1.1","fileTypesAndContributionMap":{}},{"hash":"c9d0294eb50bbd3d051ef812fc30db401db1a632","isMergeCommit":false,"messageTitle":"Revert \"Update dg v1.1\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":67,"deletions":46}}},{"hash":"44d87616ec6b8d546d083f15578cb65e6fa586fb","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-F14-2/revert-26-Updated-DG-v1.1","messageBody":"Revert \"Update dg v1.1\"","fileTypesAndContributionMap":{}},{"hash":"46d4d35070797256cbf1a01fb7a6bb5cb07954a2","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"349d3530bc407f12ef6316292df677f7da1ea3ed","isMergeCommit":false,"messageTitle":"Update UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"tengcharmaine":[{"date":"2024-03-03","commitResults":[{"hash":"6adfcc34a784f13ffc31553c6973dadbb80cac88","isMergeCommit":false,"messageTitle":"Update Ui mockup png to the new Ui mockup in readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"1486ea0ef2a180512c5976509554d75ef28089dd","isMergeCommit":false,"messageTitle":"Update readme docs for Clinic Mate from original docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":10}}},{"hash":"6e06e4ea3678473438cca55efac61b95ed58ecbf","isMergeCommit":false,"messageTitle":"Fix errors from github checks","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"19bf42edea40495ac4119f43eb631d4c62b37073","isMergeCommit":false,"messageTitle":"Update CI status badge to reflect build status of teams repo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"633a23989c72c88bc8f67cdfd1334c35eb009fa0","isMergeCommit":false,"messageTitle":"Update non-functional requirements (NFRs) to developers guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":5}}},{"hash":"6e1c8f60919f274804a665135aa7ee90348f57b0","isMergeCommit":true,"messageTitle":"Merge pull request #24 from tengcharmaine/update-readme","messageBody":"Update Project README","fileTypesAndContributionMap":{}},{"hash":"922bfe9ea876da86da32caebe1932565f064f5b4","isMergeCommit":true,"messageTitle":"Merge pull request #25 from tengcharmaine/update_NFR","messageBody":"Update non-functional requirements (NFRs) to developers guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"46d097d2b310c08dd298e62dc545ff12a54644de","isMergeCommit":true,"messageTitle":"Merge pull request #27 from Jayne1010/Updated-UG-v1.1","messageBody":"Update ug v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"3f6d958b873330dc5407e8bb3e43e7334e3e1aa6","isMergeCommit":false,"messageTitle":"Update Quick Start section of UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}],"jiahui0309":[{"date":"2024-03-03","commitResults":[{"hash":"be650b34b7753172421b5ac7dc1b96999429bb1c","isMergeCommit":false,"messageTitle":"Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":29}}},{"hash":"d7d233883734a9e0bcc21f4991fc8f820a6ba874","isMergeCommit":false,"messageTitle":"Update About Us from feedbacks","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}},{"hash":"c363de2811d3fd0a4d3110b9047eee86e9232c22","isMergeCommit":true,"messageTitle":"Merge pull request #19 from jiahui0309/update-about-us","messageBody":"Update About Us","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"9a969a3bb60e72dcfaf0bc6d755408e91f78fe54","isMergeCommit":false,"messageTitle":"Update DG usecase","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":2}}}]},{"date":"2024-03-05","commitResults":[{"hash":"f06e933edb533409ab4cce2c551b975a0b604bd2","isMergeCommit":false,"messageTitle":"Update DG usecase from comments","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}},{"hash":"f2831f7e8d61abdedfb24b7ebd72b5e7fcafd917","isMergeCommit":true,"messageTitle":"Merge pull request #29 from drustanyjt/docs-dg-glossary","messageBody":"Add medical terms in meeting notes to glossary","fileTypesAndContributionMap":{}},{"hash":"4e8320caaaf9ba28f09b91f32975fa292a0f96af","isMergeCommit":true,"messageTitle":"Merge pull request #28 from jiahui0309/update-dg-usecase","messageBody":"Update DG usecase","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"548133f9d747a41caa2218591dfc1e381a2f0f60","isMergeCommit":true,"messageTitle":"Merge pull request #33 from tengcharmaine/updateug","messageBody":"Update Quick Start section of UG","fileTypesAndContributionMap":{}},{"hash":"0d6da5c29394a526908e9fd2124d6549f57cec53","isMergeCommit":true,"messageTitle":"Merge pull request #34 from drustanyjt/docs-dg-product-scope","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8a80e337ed28e10568b9606abb2173afa58cc921","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"f2ec7ddff937a906bc2e2a0d7a00bc620db97ef3","isMergeCommit":true,"messageTitle":"Merge pull request #35 from jiahui0309/update-index","messageBody":"Update index.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"drustanyjt":{"docs":12,"functional-code":0,"test-code":0},"Jayne1010":{"docs":34,"functional-code":0,"test-code":0},"tengcharmaine":{"docs":31,"functional-code":0,"test-code":0},"jiahui0309":{"docs":120,"functional-code":0,"test-code":0}},"authorContributionVariance":{"drustanyjt":12.071006,"Jayne1010":8016.2837,"tengcharmaine":221.25446,"jiahui0309":879.31354},"authorDisplayNameMap":{"drustanyjt":"CS2103T-F14-2 YEO ..STAN","Jayne1010":"CS2103T-F14-2 CHEN..AYNE","tengcharmaine":"CS2103T-F14-2 TENG..AINE","jiahui0309":"CS2103T-F14-2 SONG.. HUI"}} diff --git a/AY2324S2-CS2103T-F14-3_tp_master/authorship.json b/AY2324S2-CS2103T-F14-3_tp_master/authorship.json index d09d9162..8651f0f5 100644 --- a/AY2324S2-CS2103T-F14-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F14-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailashgautham"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F14-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F14-3/tp/actions)","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F14-3/tp/graph/badge.svg?token\u003dLJBQBAER31)](https://codecov.io/gh/AY2324S2-CS2103-F14-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":"kailashgautham"},"content":"* This is **a project for Software Engineering (SE) students in CS2103T**.\u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"kailashgautham"},"content":" * For a TA to keep track of their students, or","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"kailashgautham"},"content":" * For a personal project to keep track of your contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"kailashgautham"},"content":"* The project simulates an ongoing software project for a desktop application (called _TA Toolkit_) used for managing contact details.","lastModifiedDate":"2024-03-04"},{"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":"kailashgautham"},"content":"* It is named `TA Toolkit` because it is a toolkit that allows TAs to manage their students\u0027 contacts and other information in a more organised manner.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"kailashgautham":6,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"g-tejas"},"content":"### Tejas Garrepally","lastModifiedDate":"2024-02-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"teojunda"},"content":"\u003cimg src\u003d\"images/g-tejas.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"g-tejas"},"content":"[[homepage](http://www.gtejas.com)]","lastModifiedDate":"2024-02-24"},{"lineNumber":19,"author":{"gitId":"g-tejas"},"content":"[[github](https://github.com/g-tejas)]","lastModifiedDate":"2024-02-24"},{"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":"g-tejas"},"content":"* Role:","lastModifiedDate":"2024-02-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"kailashgautham"},"content":"### Gautham Kailash","lastModifiedDate":"2024-02-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"kailashgautham"},"content":"\u003cimg src\u003d\"images/kailashgautham.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"kailashgautham"},"content":"[[homepage](https://www.kailashgautham.com)]","lastModifiedDate":"2024-02-24"},{"lineNumber":29,"author":{"gitId":"kailashgautham"},"content":"[[github](http://github.com/kailashgautham)]","lastModifiedDate":"2024-02-24"},{"lineNumber":30,"author":{"gitId":"kailashgautham"},"content":"[[portfolio](team/kailashgautham.md)]","lastModifiedDate":"2024-02-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"kailashgautham"},"content":"* Role: TBC","lastModifiedDate":"2024-02-24"},{"lineNumber":33,"author":{"gitId":"kailashgautham"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-02-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"hiivan"},"content":"### Ivan Ang","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"hiivan"},"content":"\u003cimg src\u003d\"images/hiivan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"hiivan"},"content":"[[homepage](https://www.ivan-ang.com)]","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"hiivan"},"content":"[[github](https://github.com/hiivan)]","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"hiivan"},"content":"[[portfolio](team/ivan.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"hiivan"},"content":"* Role: TBC","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"hiivan"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"teojunda"},"content":"### Axel Teo","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"teojunda"},"content":"\u003cimg src\u003d\"images/teojunda.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"teojunda"},"content":"[[github](http://github.com/teojunda)]","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"teojunda"},"content":"[[portfolio](team/teojunda.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"YuSoonZ"},"content":"### Ng Yu Soon","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"YuSoonZ"},"content":"\u003cimg src\u003d\"images/yusoonz.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"YuSoonZ"},"content":"[[github](http://github.com/yusoonz)]","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"YuSoonZ"},"content":"[[portfolio](team/ngyusoon.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"YuSoonZ"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"YuSoonZ":5,"kailashgautham":7,"teojunda":5,"hiivan":7,"g-tejas":4,"-":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":"teojunda"},"content":"# TA Toolkit Developer Guide","lastModifiedDate":"2024-03-05"},{"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":"teojunda"},"content":"* is a CS2103T TA in NUS School of Computing","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"teojunda"},"content":"* has a need to manage a significant number of contacts over different communication channels","lastModifiedDate":"2024-03-05"},{"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":"teojunda"},"content":"* prefers to use a separate app that is made to manage student contacts efficiently","lastModifiedDate":"2024-03-05"},{"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":"teojunda"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"teojunda"},"content":"* TA Toolkit is a desktop app that helps the user manage a large number of student contacts ","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"teojunda"},"content":"across different communication channels efficiently. It is optimised for use via a Command","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"teojunda"},"content":"Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI)","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"teojunda"},"content":"* It categorises contacts into their tutorial group, allowing for easier management of contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"teojunda"},"content":"* It allows the user to add, delete, edit, find and view student contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":292,"author":{"gitId":"teojunda"},"content":"* Users are able to take notes on specific students and keep track of tasks associated to students","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"teojunda"},"content":"|----------|---------|--------------------------------------------------------|----------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"teojunda"},"content":"| `* * *` | TA | add a student contact | keep track of my students when I need to |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"teojunda"},"content":"| `* * *` | TA | delete a student contact | remove students from the database if they drop the class |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"teojunda"},"content":"| `* * *` | TA | view all student contacts | see a list of all my students |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | edit a student contact | update a students’s details should they change |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | categorise contacts by class and project group | organise student contact details correctly |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | take notes on students | keep track of their strengths and weaknesses |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | delete notes on students | remove notes that are no longer relevant |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | mark student as absent for a specific class | be aware of who is missing lessons |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | unmark student as absent for a specific class | correct mistakes in attendance marking |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"teojunda"},"content":"| `* ` | TA | allocate tasks related to different contacts | remember my tasks associated with each student |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"teojunda"},"content":"| `* ` | TA | view all my tasks | see a list of all my tasks |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"teojunda"},"content":"| `* ` | TA | mark completion of tasks related to different contacts | keep track of my task progress |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"teojunda"},"content":"| `* ` | TA | delete a task | remove tasks that are no longer relevant |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"teojunda"},"content":"(For all use cases below, the **System** is the `TA Toolkit` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","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":"### 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":"teojunda"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"teojunda"},"content":"be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"teojunda"},"content":"4. All functions within the application must provide responses to user queries within a timeframe of 2 seconds. ","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"teojunda"},"content":"5. The applications does not support concurrent usage by multiple users. ","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"teojunda"},"content":"6. The application does not offer support for languages aside from English.","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"teojunda"},"content":"7. The application should be able to handle most common user input errors and provide meaningful error messages.","lastModifiedDate":"2024-03-05"},{"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":"teojunda"},"content":"* **CLI**: Command Line Interface: A way of interacting with a computer program where the user issues commands to the","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"teojunda"},"content":"program in the form of successive lines of text (command lines). It emphasises text-based user interaction over graphical user interfaces.","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"teojunda"},"content":"* **TA**: Teaching Assistant","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":372,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":373,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"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":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"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":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"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":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"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":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"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":407,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"teojunda":35,"-":382}},{"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":"g-tejas"},"content":"# TA Toolkit User Guide","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"g-tejas"},"content":"TA Toolkit is a **desktop app for managing students, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TA Toolkit can get your student management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"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":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"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":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":{"g-tejas":2,"-":202}},{"path":"docs/team/ivan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"hiivan"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"hiivan"},"content":" layout: default.md","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"hiivan"},"content":" title: \"Ivan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"hiivan"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"hiivan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":9,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"hiivan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"hiivan"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":14,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":15,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":16,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":17,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"hiivan"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"hiivan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"hiivan"},"content":"* **Project management**:","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"hiivan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"hiivan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-01"},{"lineNumber":26,"author":{"gitId":"hiivan"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"hiivan"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"hiivan"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"hiivan"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"hiivan"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"hiivan"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"hiivan"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"hiivan"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"hiivan"},"content":"* **Community**:","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"hiivan"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"hiivan"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-01"},{"lineNumber":39,"author":{"gitId":"hiivan"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"hiivan"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"hiivan"},"content":"* **Tools**:","lastModifiedDate":"2024-03-01"},{"lineNumber":43,"author":{"gitId":"hiivan"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"hiivan"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":46,"author":{"gitId":"hiivan"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"hiivan":46}},{"path":"docs/team/kailashgautham.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailashgautham"},"content":"---","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"kailashgautham"},"content":" layout: default.md","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"kailashgautham"},"content":" title: \"Kailash Gautham\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"kailashgautham"},"content":"---","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":6,"author":{"gitId":"kailashgautham"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-24"},{"lineNumber":7,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":8,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":9,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":10,"author":{"gitId":"kailashgautham"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-24"},{"lineNumber":11,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"kailashgautham"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-24"},{"lineNumber":13,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":14,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":15,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":16,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":17,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":18,"author":{"gitId":"kailashgautham"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-24"},{"lineNumber":19,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":20,"author":{"gitId":"kailashgautham"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-24"},{"lineNumber":21,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":22,"author":{"gitId":"kailashgautham"},"content":"* **Project management**:","lastModifiedDate":"2024-02-24"},{"lineNumber":23,"author":{"gitId":"kailashgautham"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-24"},{"lineNumber":24,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":25,"author":{"gitId":"kailashgautham"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-24"},{"lineNumber":26,"author":{"gitId":"kailashgautham"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-24"},{"lineNumber":27,"author":{"gitId":"kailashgautham"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-24"},{"lineNumber":28,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":29,"author":{"gitId":"kailashgautham"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-24"},{"lineNumber":30,"author":{"gitId":"kailashgautham"},"content":" * User Guide:","lastModifiedDate":"2024-02-24"},{"lineNumber":31,"author":{"gitId":"kailashgautham"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-24"},{"lineNumber":32,"author":{"gitId":"kailashgautham"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-24"},{"lineNumber":33,"author":{"gitId":"kailashgautham"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-24"},{"lineNumber":34,"author":{"gitId":"kailashgautham"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-24"},{"lineNumber":35,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":36,"author":{"gitId":"kailashgautham"},"content":"* **Community**:","lastModifiedDate":"2024-02-24"},{"lineNumber":37,"author":{"gitId":"kailashgautham"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-24"},{"lineNumber":38,"author":{"gitId":"kailashgautham"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-24"},{"lineNumber":39,"author":{"gitId":"kailashgautham"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-24"},{"lineNumber":40,"author":{"gitId":"kailashgautham"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-24"},{"lineNumber":41,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":42,"author":{"gitId":"kailashgautham"},"content":"* **Tools**:","lastModifiedDate":"2024-02-24"},{"lineNumber":43,"author":{"gitId":"kailashgautham"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-24"},{"lineNumber":44,"author":{"gitId":"kailashgautham"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-24"},{"lineNumber":45,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":46,"author":{"gitId":"kailashgautham"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"kailashgautham":46}},{"path":"docs/team/ngyusoon.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"YuSoonZ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"YuSoonZ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"YuSoonZ"},"content":" title: \"Yu Soon\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"YuSoonZ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"YuSoonZ"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"YuSoonZ"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"YuSoonZ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"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":"YuSoonZ"},"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":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"YuSoonZ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"YuSoonZ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"YuSoonZ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"YuSoonZ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"YuSoonZ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"YuSoonZ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"YuSoonZ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"YuSoonZ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"YuSoonZ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"YuSoonZ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"YuSoonZ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"YuSoonZ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"YuSoonZ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"YuSoonZ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"YuSoonZ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"YuSoonZ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"YuSoonZ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"YuSoonZ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"YuSoonZ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"YuSoonZ":46}},{"path":"docs/team/tejasgarrepally.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"g-tejas"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"g-tejas"},"content":" layout: default.md","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"g-tejas"},"content":" title: \"Tejas Garrepally\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"g-tejas"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"g-tejas"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":9,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"g-tejas"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"g-tejas"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":14,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":15,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":16,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":17,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"g-tejas"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"g-tejas"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"g-tejas"},"content":"* **Project management**:","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"g-tejas"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"g-tejas"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"g-tejas"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"g-tejas"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"g-tejas"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"g-tejas"},"content":" * User Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"g-tejas"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"g-tejas"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"g-tejas"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"g-tejas"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"g-tejas"},"content":"* **Community**:","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"g-tejas"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"g-tejas"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"g-tejas"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"g-tejas"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"g-tejas"},"content":"* **Tools**:","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"g-tejas"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"g-tejas"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"g-tejas"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"g-tejas":46}},{"path":"docs/team/teojunda.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"teojunda"},"content":"layout: default.md","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"teojunda"},"content":"title: \"Axel\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"teojunda"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":9,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"teojunda"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"teojunda"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":14,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":15,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":16,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":17,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"teojunda"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"teojunda"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"teojunda"},"content":"* **Project management**:","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"teojunda"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"teojunda"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"teojunda"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"teojunda"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"teojunda"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"teojunda"},"content":" * User Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"teojunda"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"teojunda"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"teojunda"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"teojunda"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"teojunda"},"content":"* **Community**:","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"teojunda"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"teojunda"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"teojunda"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"teojunda"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"teojunda"},"content":"* **Tools**:","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"teojunda"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"teojunda"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"teojunda"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"teojunda":46}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailashgautham"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F14-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F14-3/tp/actions)","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F14-3/tp/graph/badge.svg?token\u003dLJBQBAER31)](https://codecov.io/gh/AY2324S2-CS2103-F14-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":"kailashgautham"},"content":"* This is **a project for Software Engineering (SE) students in CS2103T**.\u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"kailashgautham"},"content":" * For a TA to keep track of their students, or","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"kailashgautham"},"content":" * For a personal project to keep track of your contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"kailashgautham"},"content":"* The project simulates an ongoing software project for a desktop application (called _TA Toolkit_) used for managing contact details.","lastModifiedDate":"2024-03-04"},{"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":"kailashgautham"},"content":"* It is named `TA Toolkit` because it is a toolkit that allows TAs to manage their students\u0027 contacts and other information in a more organised manner.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"kailashgautham":6,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"g-tejas"},"content":"### Tejas Garrepally","lastModifiedDate":"2024-02-24"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"teojunda"},"content":"\u003cimg src\u003d\"images/g-tejas.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"g-tejas"},"content":"[[homepage](http://www.gtejas.com)]","lastModifiedDate":"2024-02-24"},{"lineNumber":19,"author":{"gitId":"g-tejas"},"content":"[[github](https://github.com/g-tejas)]","lastModifiedDate":"2024-02-24"},{"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":"g-tejas"},"content":"* Role:","lastModifiedDate":"2024-02-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"kailashgautham"},"content":"### Gautham Kailash","lastModifiedDate":"2024-02-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"kailashgautham"},"content":"\u003cimg src\u003d\"images/kailashgautham.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"kailashgautham"},"content":"[[homepage](https://www.kailashgautham.com)]","lastModifiedDate":"2024-02-24"},{"lineNumber":29,"author":{"gitId":"kailashgautham"},"content":"[[github](http://github.com/kailashgautham)]","lastModifiedDate":"2024-02-24"},{"lineNumber":30,"author":{"gitId":"kailashgautham"},"content":"[[portfolio](team/kailashgautham.md)]","lastModifiedDate":"2024-02-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"kailashgautham"},"content":"* Role: TBC","lastModifiedDate":"2024-02-24"},{"lineNumber":33,"author":{"gitId":"kailashgautham"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-02-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"hiivan"},"content":"### Ivan Ang","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"hiivan"},"content":"\u003cimg src\u003d\"images/hiivan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"hiivan"},"content":"[[homepage](https://www.ivan-ang.com)]","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"hiivan"},"content":"[[github](https://github.com/hiivan)]","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"hiivan"},"content":"[[portfolio](team/ivan.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"hiivan"},"content":"* Role: TBC","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"hiivan"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"teojunda"},"content":"### Axel Teo","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"teojunda"},"content":"\u003cimg src\u003d\"images/teojunda.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"teojunda"},"content":"[[github](http://github.com/teojunda)]","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"teojunda"},"content":"[[portfolio](team/teojunda.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"YuSoonZ"},"content":"### Ng Yu Soon","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"YuSoonZ"},"content":"\u003cimg src\u003d\"images/yusoonz.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"YuSoonZ"},"content":"[[github](http://github.com/yusoonz)]","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"YuSoonZ"},"content":"[[portfolio](team/ngyusoon.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"YuSoonZ"},"content":"* Responsibilities: TBC","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"YuSoonZ":5,"kailashgautham":7,"teojunda":5,"hiivan":7,"g-tejas":4,"-":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":"teojunda"},"content":"# TA Toolkit Developer Guide","lastModifiedDate":"2024-03-05"},{"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":"teojunda"},"content":"* is a CS2103T TA in NUS School of Computing","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"teojunda"},"content":"* has a need to manage a significant number of contacts over different communication channels","lastModifiedDate":"2024-03-05"},{"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":"teojunda"},"content":"* prefers to use a separate app that is made to manage student contacts efficiently","lastModifiedDate":"2024-03-05"},{"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":"teojunda"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"teojunda"},"content":"* TA Toolkit is a desktop app that helps the user manage a large number of student contacts ","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"teojunda"},"content":"across different communication channels efficiently. It is optimised for use via a Command","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"teojunda"},"content":"Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI)","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"teojunda"},"content":"* It categorises contacts into their tutorial group, allowing for easier management of contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"teojunda"},"content":"* It allows the user to add, delete, edit, find and view student contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":292,"author":{"gitId":"teojunda"},"content":"* Users are able to take notes on specific students and keep track of tasks associated to students","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"teojunda"},"content":"|----------|---------|-----------------------------------------------|----------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"teojunda"},"content":"| `* * *` | TA | add a student contact | keep track of my students when I need to |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"teojunda"},"content":"| `* * *` | TA | delete a student contact | remove students from the database if they drop the class |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"teojunda"},"content":"| `* * *` | TA | view all student contacts | see a list of all my students |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | view a students\u0027 detailed information | see all the information related to a student |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | edit a student contact | update a students’s details should they change |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | assign student to project team | organise students according to their project team |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | take notes on students | keep track of their strengths and weaknesses |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"teojunda"},"content":"| `* *` | TA | delete notes on students | remove notes that are no longer relevant |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"teojunda"},"content":"| `*` | TA | mark student as absent for a specific class | be aware of who is missing lessons |","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"teojunda"},"content":"| `*` | TA | unmark student as absent for a specific class | correct mistakes in attendance marking |","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"teojunda"},"content":"| `* ` | TA | view all student contacts for a project team | see a list of students in a project team |","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"teojunda"},"content":"| `* ` | TA | view summary of all students attendance | get a quick overview of class attendance |","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"*{More to be added}*","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":"teojunda"},"content":"(For all use cases below, the **System** is the `TA Toolkit` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"teojunda"},"content":"**Use case: UC01 - Adding a student**","lastModifiedDate":"2024-03-06"},{"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":"teojunda"},"content":"1. User enters command to add a student","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit adds the student to the list of students","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message along with the student’s contact details","lastModifiedDate":"2024-03-06"},{"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":"teojunda"},"content":"* 1a. The add student command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"teojunda"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"teojunda"},"content":"* 2a. Student already exists in the list of students.","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"teojunda"},"content":" * 2a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"teojunda"},"content":"**Use case: UC02 - Deleting a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"teojunda"},"content":"1. User enters command to delete a student","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit requests for confirmation","lastModifiedDate":"2024-03-06"},{"lineNumber":349,"author":{"gitId":"teojunda"},"content":"3. User confirms","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"teojunda"},"content":"4. TA Toolkit deletes the student’s contact and displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"teojunda"},"content":"* 1a. TA Toolkit does not contain the student specified","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":360,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"teojunda"},"content":"* 3a. The User chooses to cancel the deletion of the student","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"teojunda"},"content":" * 3a1. TA Toolkit cancels the deletion","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":365,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"teojunda"},"content":"**Use case: UC03 - Update a student**","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":370,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"teojunda"},"content":"1. User enters the command to update a student’s details","lastModifiedDate":"2024-03-06"},{"lineNumber":373,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit modifies the values that user intended to replace","lastModifiedDate":"2024-03-06"},{"lineNumber":374,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message along with the student’s updated contact details","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"teojunda"},"content":"* 1a. The update student command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"teojunda"},"content":"* 2a. Student does not exist in the list of students.","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"teojunda"},"content":" * 2a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"teojunda"},"content":"**Use case: UC04 - Viewing students overview**","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"teojunda"},"content":"1. User requests to view all student","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit shows a list of all members","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":401,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"teojunda"},"content":"**Use case: UC05 - View a student detailed**","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"teojunda"},"content":"1. User requests to view the detailed information of a student","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit shows the detailed information of the student","lastModifiedDate":"2024-03-06"},{"lineNumber":410,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":411,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":412,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":415,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":416,"author":{"gitId":"teojunda"},"content":"* 1a. The view student command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":417,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":418,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":420,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":421,"author":{"gitId":"teojunda"},"content":"* 1b. The requested student is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"teojunda"},"content":" * 1b1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":425,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":428,"author":{"gitId":"teojunda"},"content":"**Use case: UC06 - Assign student to project team**","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"teojunda"},"content":"1. User requests to assign student to project team","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit adds the project team tag to the student","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"teojunda"},"content":"* 1a. The group student command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":444,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"teojunda"},"content":"* 1b. The requested student is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"teojunda"},"content":" * 1b1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":450,"author":{"gitId":"teojunda"},"content":"* 2b. The student is already assigned a project team tag.","lastModifiedDate":"2024-03-06"},{"lineNumber":451,"author":{"gitId":"teojunda"},"content":" * 2b1. TA Toolkit shows a message asking whether to replace or keep the existing tag.","lastModifiedDate":"2024-03-06"},{"lineNumber":452,"author":{"gitId":"teojunda"},"content":" * 2b1a. User decides to replace the existing tag.","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"teojunda"},"content":" * 2b1a1. TA Toolkit removes the current project team tag from the student.","lastModifiedDate":"2024-03-06"},{"lineNumber":454,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"teojunda"},"content":" * 2b1b. User decides to keep the existing tag.","lastModifiedDate":"2024-03-06"},{"lineNumber":458,"author":{"gitId":"teojunda"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":459,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":460,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":461,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":462,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":463,"author":{"gitId":"teojunda"},"content":"**Use case: UC07 - Add note on student**","lastModifiedDate":"2024-03-06"},{"lineNumber":464,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":465,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":466,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":467,"author":{"gitId":"teojunda"},"content":"1. User requests to add a note regarding a student","lastModifiedDate":"2024-03-06"},{"lineNumber":468,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit adds the note to the student’s list of notes","lastModifiedDate":"2024-03-06"},{"lineNumber":469,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":470,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":471,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":472,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":473,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":475,"author":{"gitId":"teojunda"},"content":"* 1a. The add note command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":476,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":477,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":478,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":479,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":480,"author":{"gitId":"teojunda"},"content":"* 1b. The requested student is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":481,"author":{"gitId":"teojunda"},"content":" * 1b1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":484,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":485,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":486,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":487,"author":{"gitId":"teojunda"},"content":"**Use case: UC08 - Delete note on student**","lastModifiedDate":"2024-03-06"},{"lineNumber":488,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":489,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":490,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":491,"author":{"gitId":"teojunda"},"content":"1. User requests to delete a note regarding a student","lastModifiedDate":"2024-03-06"},{"lineNumber":492,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit removes the note from the student’s list of notes","lastModifiedDate":"2024-03-06"},{"lineNumber":493,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"teojunda"},"content":"* 1a. The delete note command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"teojunda"},"content":"* 1b. The requested student is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":505,"author":{"gitId":"teojunda"},"content":" * 1b1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":506,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":507,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":508,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":509,"author":{"gitId":"teojunda"},"content":"* 2a. The note requested to be deleted is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"teojunda"},"content":" * 2a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"teojunda"},"content":"**Use case: UC09 - Mark student as absent from a specific class**","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":519,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":520,"author":{"gitId":"teojunda"},"content":"1. Use requests to mark student as absent for a class","lastModifiedDate":"2024-03-06"},{"lineNumber":521,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit marks the student as absent for that class","lastModifiedDate":"2024-03-06"},{"lineNumber":522,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":523,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":524,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":525,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":526,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":527,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":528,"author":{"gitId":"teojunda"},"content":"* 1a. The mark student command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":529,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":530,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":531,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":532,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":533,"author":{"gitId":"teojunda"},"content":"* 1b. The requested student is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":534,"author":{"gitId":"teojunda"},"content":" * 1b1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":535,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":536,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":537,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":538,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":539,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":540,"author":{"gitId":"teojunda"},"content":"**Use case: UC10 - Unmark student as absent for a class**","lastModifiedDate":"2024-03-06"},{"lineNumber":541,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":542,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":543,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":544,"author":{"gitId":"teojunda"},"content":"1. User requests to mark student as absent for a class","lastModifiedDate":"2024-03-06"},{"lineNumber":545,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit marks the student as absent for that class","lastModifiedDate":"2024-03-06"},{"lineNumber":546,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":547,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":548,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":549,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":550,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":551,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":552,"author":{"gitId":"teojunda"},"content":"* 1a. The unmark student command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":553,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":554,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":555,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":556,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":557,"author":{"gitId":"teojunda"},"content":"* 1b. The requested student is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":558,"author":{"gitId":"teojunda"},"content":" * 1b1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":559,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":560,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":561,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":562,"author":{"gitId":"teojunda"},"content":"* 2a. The requested student is not currently marked as absent for the class.","lastModifiedDate":"2024-03-06"},{"lineNumber":563,"author":{"gitId":"teojunda"},"content":" * 2a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":564,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":565,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":566,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":567,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":568,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":569,"author":{"gitId":"teojunda"},"content":"**Use case: UC11 - View all students by project team tag**","lastModifiedDate":"2024-03-06"},{"lineNumber":570,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":571,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":572,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":573,"author":{"gitId":"teojunda"},"content":"1. User requests to view all students with a specified project team tag","lastModifiedDate":"2024-03-06"},{"lineNumber":574,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit displays a list of all members with that project team tag","lastModifiedDate":"2024-03-06"},{"lineNumber":575,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":576,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":577,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":578,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":579,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":580,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":581,"author":{"gitId":"teojunda"},"content":"* 1a. The view student by tag command format is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":582,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":583,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":584,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":585,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":586,"author":{"gitId":"teojunda"},"content":"* 1b. The requested tag is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":587,"author":{"gitId":"teojunda"},"content":" * 1b1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":588,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":589,"author":{"gitId":"teojunda"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":590,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":591,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":592,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":593,"author":{"gitId":"teojunda"},"content":"**Use case: UC12 - View summary of students attendance**","lastModifiedDate":"2024-03-06"},{"lineNumber":594,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":595,"author":{"gitId":"teojunda"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":596,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":597,"author":{"gitId":"teojunda"},"content":"1. User requests to view a summary of all students attendance","lastModifiedDate":"2024-03-06"},{"lineNumber":598,"author":{"gitId":"teojunda"},"content":"2. TA Toolkit displays a summary of all students attendance","lastModifiedDate":"2024-03-06"},{"lineNumber":599,"author":{"gitId":"teojunda"},"content":"3. TA Toolkit displays a success message","lastModifiedDate":"2024-03-06"},{"lineNumber":600,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":601,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":602,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":603,"author":{"gitId":"teojunda"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":604,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":605,"author":{"gitId":"teojunda"},"content":"* 1a. There are no students in storage.","lastModifiedDate":"2024-03-06"},{"lineNumber":606,"author":{"gitId":"teojunda"},"content":" * 1a1. TA Toolkit shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":607,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":608,"author":{"gitId":"teojunda"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":609,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":610,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":613,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":614,"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":615,"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":616,"author":{"gitId":"teojunda"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should","lastModifiedDate":"2024-03-05"},{"lineNumber":617,"author":{"gitId":"teojunda"},"content":"be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":618,"author":{"gitId":"teojunda"},"content":"4. All functions within the application must provide responses to user queries within a timeframe of 2 seconds. ","lastModifiedDate":"2024-03-05"},{"lineNumber":619,"author":{"gitId":"teojunda"},"content":"5. The applications does not support concurrent usage by multiple users. ","lastModifiedDate":"2024-03-05"},{"lineNumber":620,"author":{"gitId":"teojunda"},"content":"6. The application does not offer support for languages aside from English.","lastModifiedDate":"2024-03-05"},{"lineNumber":621,"author":{"gitId":"teojunda"},"content":"7. The application should be able to handle most common user input errors and provide meaningful error messages.","lastModifiedDate":"2024-03-05"},{"lineNumber":622,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":623,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":624,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":625,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":626,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":627,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":628,"author":{"gitId":"teojunda"},"content":"* **CLI**: Command Line Interface: A way of interacting with a computer program where the user issues commands to the","lastModifiedDate":"2024-03-05"},{"lineNumber":629,"author":{"gitId":"teojunda"},"content":"program in the form of successive lines of text (command lines). It emphasises text-based user interaction over graphical user interfaces.","lastModifiedDate":"2024-03-05"},{"lineNumber":630,"author":{"gitId":"teojunda"},"content":"* **TA**: Teaching Assistant","lastModifiedDate":"2024-03-05"},{"lineNumber":631,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":632,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":633,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":634,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":635,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":636,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":637,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":638,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":639,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":640,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":643,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":644,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":646,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":647,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":648,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":649,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":650,"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":651,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":652,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":653,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":654,"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":655,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":656,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":657,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":658,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":659,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":660,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":661,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":662,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":663,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":664,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":665,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":666,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":667,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":668,"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":669,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":670,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":671,"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":672,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":673,"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":674,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":675,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":676,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":677,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":678,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":679,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":680,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":681,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":682,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":683,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":684,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"teojunda":305,"-":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":"g-tejas"},"content":"# TA Toolkit User Guide","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"g-tejas"},"content":"TA Toolkit is a **desktop app for managing students, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TA Toolkit can get your student management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-05"},{"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":"kailashgautham"},"content":"1. Download the latest `TAToolkit.jar` from [here](https://github.com/AY2324S2-CS2103T-F14-3/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"kailashgautham"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your TA Toolkit.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"kailashgautham"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar TAToolkit.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"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 TA Toolkit.","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"content":"Adds a person to the TA Toolkit.","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"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":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"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":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":"kailashgautham"},"content":"Shows a list of all persons in the TA Toolkit.","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"content":"Edits an existing person in the TA Toolkit.","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"content":"Deletes the specified person from the TA Toolkit.","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the TA Toolkit.","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"content":"Clears all entries from the TA Toolkit.","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"content":"TAToolkit 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":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":"kailashgautham"},"content":"TAToolkit data are saved automatically as a JSON file `[JAR file location]/data/TAToolkit.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-06"},{"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":"kailashgautham"},"content":"If your changes to the data file makes its format invalid, TAToolkit 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":172,"author":{"gitId":"kailashgautham"},"content":"Furthermore, certain edits can cause the TAToolkit 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":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":"kailashgautham"},"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 TAToolkit home folder.","lastModifiedDate":"2024-03-06"},{"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":{"kailashgautham":15,"g-tejas":2,"-":187}},{"path":"docs/team/ivan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"hiivan"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"hiivan"},"content":" layout: default.md","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"hiivan"},"content":" title: \"Ivan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"hiivan"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"hiivan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":9,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"hiivan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"hiivan"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":14,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":15,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":16,"author":{"gitId":"hiivan"},"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-01"},{"lineNumber":17,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"hiivan"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"hiivan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"hiivan"},"content":"* **Project management**:","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"hiivan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"hiivan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-01"},{"lineNumber":26,"author":{"gitId":"hiivan"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"hiivan"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-01"},{"lineNumber":28,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":29,"author":{"gitId":"hiivan"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"hiivan"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"hiivan"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"hiivan"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"hiivan"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"hiivan"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":36,"author":{"gitId":"hiivan"},"content":"* **Community**:","lastModifiedDate":"2024-03-01"},{"lineNumber":37,"author":{"gitId":"hiivan"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-01"},{"lineNumber":38,"author":{"gitId":"hiivan"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-01"},{"lineNumber":39,"author":{"gitId":"hiivan"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-01"},{"lineNumber":40,"author":{"gitId":"hiivan"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-01"},{"lineNumber":41,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":42,"author":{"gitId":"hiivan"},"content":"* **Tools**:","lastModifiedDate":"2024-03-01"},{"lineNumber":43,"author":{"gitId":"hiivan"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-01"},{"lineNumber":44,"author":{"gitId":"hiivan"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-01"},{"lineNumber":45,"author":{"gitId":"hiivan"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":46,"author":{"gitId":"hiivan"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"hiivan":46}},{"path":"docs/team/kailashgautham.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailashgautham"},"content":"---","lastModifiedDate":"2024-02-24"},{"lineNumber":2,"author":{"gitId":"kailashgautham"},"content":" layout: default.md","lastModifiedDate":"2024-02-24"},{"lineNumber":3,"author":{"gitId":"kailashgautham"},"content":" title: \"Kailash Gautham\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"kailashgautham"},"content":"---","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":6,"author":{"gitId":"kailashgautham"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-24"},{"lineNumber":7,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":8,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":9,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":10,"author":{"gitId":"kailashgautham"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-24"},{"lineNumber":11,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"kailashgautham"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-24"},{"lineNumber":13,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":14,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":15,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":16,"author":{"gitId":"kailashgautham"},"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-24"},{"lineNumber":17,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":18,"author":{"gitId":"kailashgautham"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-24"},{"lineNumber":19,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":20,"author":{"gitId":"kailashgautham"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-24"},{"lineNumber":21,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":22,"author":{"gitId":"kailashgautham"},"content":"* **Project management**:","lastModifiedDate":"2024-02-24"},{"lineNumber":23,"author":{"gitId":"kailashgautham"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-24"},{"lineNumber":24,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":25,"author":{"gitId":"kailashgautham"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-24"},{"lineNumber":26,"author":{"gitId":"kailashgautham"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-24"},{"lineNumber":27,"author":{"gitId":"kailashgautham"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-24"},{"lineNumber":28,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":29,"author":{"gitId":"kailashgautham"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-24"},{"lineNumber":30,"author":{"gitId":"kailashgautham"},"content":" * User Guide:","lastModifiedDate":"2024-02-24"},{"lineNumber":31,"author":{"gitId":"kailashgautham"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-24"},{"lineNumber":32,"author":{"gitId":"kailashgautham"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-24"},{"lineNumber":33,"author":{"gitId":"kailashgautham"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-24"},{"lineNumber":34,"author":{"gitId":"kailashgautham"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-24"},{"lineNumber":35,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":36,"author":{"gitId":"kailashgautham"},"content":"* **Community**:","lastModifiedDate":"2024-02-24"},{"lineNumber":37,"author":{"gitId":"kailashgautham"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-24"},{"lineNumber":38,"author":{"gitId":"kailashgautham"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-24"},{"lineNumber":39,"author":{"gitId":"kailashgautham"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-24"},{"lineNumber":40,"author":{"gitId":"kailashgautham"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-24"},{"lineNumber":41,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":42,"author":{"gitId":"kailashgautham"},"content":"* **Tools**:","lastModifiedDate":"2024-02-24"},{"lineNumber":43,"author":{"gitId":"kailashgautham"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-24"},{"lineNumber":44,"author":{"gitId":"kailashgautham"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-24"},{"lineNumber":45,"author":{"gitId":"kailashgautham"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":46,"author":{"gitId":"kailashgautham"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"kailashgautham":46}},{"path":"docs/team/ngyusoon.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"YuSoonZ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"YuSoonZ"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"YuSoonZ"},"content":" title: \"Yu Soon\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"YuSoonZ"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"YuSoonZ"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"YuSoonZ"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"YuSoonZ"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"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":"YuSoonZ"},"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":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"YuSoonZ"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"YuSoonZ"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"YuSoonZ"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"YuSoonZ"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"YuSoonZ"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"YuSoonZ"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"YuSoonZ"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"YuSoonZ"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"YuSoonZ"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"YuSoonZ"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"YuSoonZ"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"YuSoonZ"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"YuSoonZ"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"YuSoonZ"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"YuSoonZ"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"YuSoonZ"},"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":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"YuSoonZ"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"YuSoonZ"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"YuSoonZ"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"YuSoonZ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"YuSoonZ"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"YuSoonZ":46}},{"path":"docs/team/tejasgarrepally.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"g-tejas"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"g-tejas"},"content":" layout: default.md","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"g-tejas"},"content":" title: \"Tejas Garrepally\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"g-tejas"},"content":"---","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"g-tejas"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":9,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"g-tejas"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"g-tejas"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":14,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":15,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":16,"author":{"gitId":"g-tejas"},"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-27"},{"lineNumber":17,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"g-tejas"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"g-tejas"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"g-tejas"},"content":"* **Project management**:","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"g-tejas"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"g-tejas"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"g-tejas"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"g-tejas"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"g-tejas"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"g-tejas"},"content":" * User Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"g-tejas"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"g-tejas"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"g-tejas"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"g-tejas"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"g-tejas"},"content":"* **Community**:","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"g-tejas"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"g-tejas"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"g-tejas"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-02-27"},{"lineNumber":40,"author":{"gitId":"g-tejas"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":42,"author":{"gitId":"g-tejas"},"content":"* **Tools**:","lastModifiedDate":"2024-02-27"},{"lineNumber":43,"author":{"gitId":"g-tejas"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"g-tejas"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"g-tejas"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"g-tejas"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"g-tejas":46}},{"path":"docs/team/teojunda.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"teojunda"},"content":"layout: default.md","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"teojunda"},"content":"title: \"Axel\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"teojunda"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"teojunda"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":9,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"teojunda"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"teojunda"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":14,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":15,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":16,"author":{"gitId":"teojunda"},"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-02"},{"lineNumber":17,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"teojunda"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"teojunda"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"teojunda"},"content":"* **Project management**:","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"teojunda"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"teojunda"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"teojunda"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"teojunda"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"teojunda"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"teojunda"},"content":" * User Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"teojunda"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"teojunda"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"teojunda"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"teojunda"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"teojunda"},"content":"* **Community**:","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"teojunda"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"teojunda"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"teojunda"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"teojunda"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"teojunda"},"content":"* **Tools**:","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"teojunda"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"teojunda"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"teojunda"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"teojunda"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"teojunda":46}}] diff --git a/AY2324S2-CS2103T-F14-3_tp_master/commits.json b/AY2324S2-CS2103T-F14-3_tp_master/commits.json index 80b72309..f233f506 100644 --- a/AY2324S2-CS2103T-F14-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-F14-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"YuSoonZ":[{"date":"2024-03-05","commitResults":[{"hash":"b9c56c9dda92dd27201d81764616fc60791aa291","isMergeCommit":false,"messageTitle":"Update yu soon\u0027s aboutus page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"f1d821810cc1b123fdbf1e4faa1a6eb684b44ee2","isMergeCommit":false,"messageTitle":"Update name of image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"36ed2c103c058a38ada0600bc1c428ccb74db4df","isMergeCommit":true,"messageTitle":"Merge pull request #29 from YuSoonZ/yusoong-aboutus","messageBody":"Update yu soon\u0027s aboutus page","fileTypesAndContributionMap":{}}]}],"kailashgautham":[{"date":"2024-02-24","commitResults":[{"hash":"5c3f966e18570ab676d5eaa1c48b5ce0e6f42a1b","isMergeCommit":false,"messageTitle":"Update about us details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":6}}}]},{"date":"2024-03-01","commitResults":[{"hash":"381274265285826aef7febe42ede6db0debde5c7","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kailashgautham/kailash/about-us","messageBody":"Add Kailash\u0027s AboutUs information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"6fafd172e2796fe44ce6b74f9ee51f18cf8c9bec","isMergeCommit":false,"messageTitle":"Adapted readme for current project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":8}}}]},{"date":"2024-03-05","commitResults":[{"hash":"eaaecee4ee25cbc2cd77ebe5528307520c4b617f","isMergeCommit":true,"messageTitle":"Merge pull request #27 from kailashgautham/kailash/adapt-website","messageBody":"Adapted readme for current project","fileTypesAndContributionMap":{}}]}],"teojunda":[{"date":"2024-03-02","commitResults":[{"hash":"fe6c0dfefcffabe9870d9126f8cc9e10883dfd87","isMergeCommit":true,"messageTitle":"Merge pull request #22 from hiivan/ivan/about-us","messageBody":"Add Ivan\u0027s AboutUs information","fileTypesAndContributionMap":{}},{"hash":"512af22a564047de6d830a0bfb28cee6db561bba","isMergeCommit":false,"messageTitle":"Add Axel\u0027s AboutUs information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"fd3acf07937083126958635ebe7a8f68b3d4c8b6","isMergeCommit":false,"messageTitle":"Update Axel\u0027s AboutUs file names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"efa7b2b348157e966fd07ef3066d90e2402f2e61","isMergeCommit":true,"messageTitle":"Merge pull request #25 from teojunda/axel/about-us","messageBody":"Add Axel\u0027s AboutUs information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"c3e8aa9a4c2a4130a3c46daa7ba5e33a08fe2f7f","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Update information on target user profile, value proposition, user stories, non-functional requirements, glossary\n","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":15}}},{"hash":"bf4b62d4e780385a48a469c3d828984ac94eeebf","isMergeCommit":false,"messageTitle":"Update user stories in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"eff5aaa28b67d32561bafdac77d37f61e00ce609","isMergeCommit":false,"messageTitle":"Update user stories related to attendance taking","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"a0b91e21d2211940d001bb6381c5f910a29ac548","isMergeCommit":true,"messageTitle":"Merge pull request #30 from teojunda/axel/developer-guide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}}]}],"hiivan":[{"date":"2024-03-01","commitResults":[{"hash":"5d746669b48fef4d63062ab9730c706a96a70c75","isMergeCommit":false,"messageTitle":"Add Ivan\u0027s AboutUs information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":5}}},{"hash":"70ab35da84ca31586c8e9dafe8b0251e17acb473","isMergeCommit":false,"messageTitle":"Add new line to EOF of ivan.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"g-tejas":[{"date":"2024-02-24","commitResults":[{"hash":"c1cd4cd89798a08f35de89648804e4544ba9fc96","isMergeCommit":false,"messageTitle":"Add Tejas\u0027s AboutUs information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]},{"date":"2024-02-27","commitResults":[{"hash":"bee3fa36384793b09d5cc30fd5328ba2beb98658","isMergeCommit":false,"messageTitle":"Add personal portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":0}}}]},{"date":"2024-03-01","commitResults":[{"hash":"e951423e72c94f181a2eea5f7fcacd396a5c55b3","isMergeCommit":true,"messageTitle":"Merge pull request #15 from g-tejas/tejas/about-us","messageBody":"Add Tejas\u0027s AboutUs information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"8ff7903374c7fa64e20b550a25d8d716e3f7ab96","isMergeCommit":true,"messageTitle":"Merge pull request #23 from g-tejas/tejas/about-us","messageBody":"Fix image name","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"e05aeed7e93e5978748f30a79c1845cdc1790302","isMergeCommit":false,"messageTitle":"Adapt UG to new product","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bfd5af372285cf928c7bf76673627921cc1db693","isMergeCommit":true,"messageTitle":"Merge pull request #33 from g-tejas/tejas/update-ug","messageBody":"Remove traces of AB3 from UG","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"YuSoonZ":{"docs":51,"functional-code":0,"test-code":0},"kailashgautham":{"docs":59,"functional-code":0,"test-code":0},"teojunda":{"docs":86,"functional-code":0,"test-code":0},"hiivan":{"docs":53,"functional-code":0,"test-code":0},"g-tejas":{"docs":52,"functional-code":0,"test-code":0}},"authorContributionVariance":{"YuSoonZ":256.97223,"kailashgautham":269.40964,"teojunda":491.74304,"hiivan":293.63882,"g-tejas":161.0},"authorDisplayNameMap":{"YuSoonZ":"CS2103T-F14-3 NG Y..SOON","kailashgautham":"CS2103T-F14-3 GAUT..LASH","teojunda":"CS2103T-F14-3 TEO ..AXEL","hiivan":"CS2103T-F14-3 ANG ..IVAN","g-tejas":"CS2103T-F14-3 GARR..EJAS"}} +{"authorDailyContributionsMap":{"YuSoonZ":[{"date":"2024-03-05","commitResults":[{"hash":"b9c56c9dda92dd27201d81764616fc60791aa291","isMergeCommit":false,"messageTitle":"Update yu soon\u0027s aboutus page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"f1d821810cc1b123fdbf1e4faa1a6eb684b44ee2","isMergeCommit":false,"messageTitle":"Update name of image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"36ed2c103c058a38ada0600bc1c428ccb74db4df","isMergeCommit":true,"messageTitle":"Merge pull request #29 from YuSoonZ/yusoong-aboutus","messageBody":"Update yu soon\u0027s aboutus page","fileTypesAndContributionMap":{}}]}],"kailashgautham":[{"date":"2024-02-24","commitResults":[{"hash":"5c3f966e18570ab676d5eaa1c48b5ce0e6f42a1b","isMergeCommit":false,"messageTitle":"Update about us details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":6}}}]},{"date":"2024-03-01","commitResults":[{"hash":"381274265285826aef7febe42ede6db0debde5c7","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kailashgautham/kailash/about-us","messageBody":"Add Kailash\u0027s AboutUs information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"6fafd172e2796fe44ce6b74f9ee51f18cf8c9bec","isMergeCommit":false,"messageTitle":"Adapted readme for current project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":8}}}]},{"date":"2024-03-05","commitResults":[{"hash":"eaaecee4ee25cbc2cd77ebe5528307520c4b617f","isMergeCommit":true,"messageTitle":"Merge pull request #27 from kailashgautham/kailash/adapt-website","messageBody":"Adapted readme for current project","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"00e866ac899c0fb90ff47859fcb3fc540b4592c5","isMergeCommit":false,"messageTitle":"Remove ab3 traces","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]}],"teojunda":[{"date":"2024-03-02","commitResults":[{"hash":"fe6c0dfefcffabe9870d9126f8cc9e10883dfd87","isMergeCommit":true,"messageTitle":"Merge pull request #22 from hiivan/ivan/about-us","messageBody":"Add Ivan\u0027s AboutUs information","fileTypesAndContributionMap":{}},{"hash":"512af22a564047de6d830a0bfb28cee6db561bba","isMergeCommit":false,"messageTitle":"Add Axel\u0027s AboutUs information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"fd3acf07937083126958635ebe7a8f68b3d4c8b6","isMergeCommit":false,"messageTitle":"Update Axel\u0027s AboutUs file names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"efa7b2b348157e966fd07ef3066d90e2402f2e61","isMergeCommit":true,"messageTitle":"Merge pull request #25 from teojunda/axel/about-us","messageBody":"Add Axel\u0027s AboutUs information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"c3e8aa9a4c2a4130a3c46daa7ba5e33a08fe2f7f","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Update information on target user profile, value proposition, user stories, non-functional requirements, glossary\n","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":15}}},{"hash":"bf4b62d4e780385a48a469c3d828984ac94eeebf","isMergeCommit":false,"messageTitle":"Update user stories in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"eff5aaa28b67d32561bafdac77d37f61e00ce609","isMergeCommit":false,"messageTitle":"Update user stories related to attendance taking","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"a0b91e21d2211940d001bb6381c5f910a29ac548","isMergeCommit":true,"messageTitle":"Merge pull request #30 from teojunda/axel/developer-guide","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"762709b576e80bc340dd077687f0898f504f6f30","isMergeCommit":false,"messageTitle":"Add use cases in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":264,"deletions":17}}},{"hash":"8e18da63f9c99f7e753f51bf63674ed1596158ea","isMergeCommit":false,"messageTitle":"Add use case for student attendance summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":13}}},{"hash":"d1f2a9c87d11c6f38ffd4bf82ea7d6617e43b290","isMergeCommit":true,"messageTitle":"Merge pull request #37 from teojunda/axel/developer-guide","messageBody":"Add use cases in developer guide","fileTypesAndContributionMap":{}}]}],"hiivan":[{"date":"2024-03-01","commitResults":[{"hash":"5d746669b48fef4d63062ab9730c706a96a70c75","isMergeCommit":false,"messageTitle":"Add Ivan\u0027s AboutUs information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":5}}},{"hash":"70ab35da84ca31586c8e9dafe8b0251e17acb473","isMergeCommit":false,"messageTitle":"Add new line to EOF of ivan.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"g-tejas":[{"date":"2024-02-24","commitResults":[{"hash":"c1cd4cd89798a08f35de89648804e4544ba9fc96","isMergeCommit":false,"messageTitle":"Add Tejas\u0027s AboutUs information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]},{"date":"2024-02-27","commitResults":[{"hash":"bee3fa36384793b09d5cc30fd5328ba2beb98658","isMergeCommit":false,"messageTitle":"Add personal portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":0}}}]},{"date":"2024-03-01","commitResults":[{"hash":"e951423e72c94f181a2eea5f7fcacd396a5c55b3","isMergeCommit":true,"messageTitle":"Merge pull request #15 from g-tejas/tejas/about-us","messageBody":"Add Tejas\u0027s AboutUs information","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"8ff7903374c7fa64e20b550a25d8d716e3f7ab96","isMergeCommit":true,"messageTitle":"Merge pull request #23 from g-tejas/tejas/about-us","messageBody":"Fix image name","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"e05aeed7e93e5978748f30a79c1845cdc1790302","isMergeCommit":false,"messageTitle":"Adapt UG to new product","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bfd5af372285cf928c7bf76673627921cc1db693","isMergeCommit":true,"messageTitle":"Merge pull request #33 from g-tejas/tejas/update-ug","messageBody":"Remove traces of AB3 from UG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"2a56d99f96975b8a6e925e6e4a445c7fec1e9d07","isMergeCommit":true,"messageTitle":"Merge pull request #35 from kailashgautham/kailash/userguide","messageBody":"Remove ab3 traces","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"YuSoonZ":{"docs":51,"functional-code":0,"test-code":0},"kailashgautham":{"docs":74,"functional-code":0,"test-code":0},"teojunda":{"docs":356,"functional-code":0,"test-code":0},"hiivan":{"docs":53,"functional-code":0,"test-code":0},"g-tejas":{"docs":52,"functional-code":0,"test-code":0}},"authorContributionVariance":{"YuSoonZ":238.86388,"kailashgautham":289.3018,"teojunda":7592.9834,"hiivan":272.94678,"g-tejas":150.39053},"authorDisplayNameMap":{"YuSoonZ":"CS2103T-F14-3 NG Y..SOON","kailashgautham":"CS2103T-F14-3 GAUT..LASH","teojunda":"CS2103T-F14-3 TEO ..AXEL","hiivan":"CS2103T-F14-3 ANG ..IVAN","g-tejas":"CS2103T-F14-3 GARR..EJAS"}} diff --git a/AY2324S2-CS2103T-T08-2_tp_master/authorship.json b/AY2324S2-CS2103T-T08-2_tp_master/authorship.json index fe51488c..097a4cad 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/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}}] diff --git a/AY2324S2-CS2103T-T08-2_tp_master/commits.json b/AY2324S2-CS2103T-T08-2_tp_master/commits.json index faefd636..2a3aca6e 100644 --- a/AY2324S2-CS2103T-T08-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T08-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"nigel27022001":[],"chonghaoen":[],"0-yibai":[],"Joelwang22":[],"bertrandong":[]},"authorFileTypeContributionMap":{"nigel27022001":{"docs":0,"functional-code":0,"test-code":0},"chonghaoen":{"docs":0,"functional-code":0,"test-code":0},"0-yibai":{"docs":0,"functional-code":0,"test-code":0},"Joelwang22":{"docs":0,"functional-code":0,"test-code":0},"bertrandong":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"nigel27022001":0.0,"chonghaoen":0.0,"0-yibai":0.0,"Joelwang22":0.0,"bertrandong":0.0},"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":[],"chonghaoen":[],"0-yibai":[],"Joelwang22":[],"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":{}}]}]},"authorFileTypeContributionMap":{"nigel27022001":{"docs":0,"functional-code":0,"test-code":0},"chonghaoen":{"docs":0,"functional-code":0,"test-code":0},"0-yibai":{"docs":0,"functional-code":0,"test-code":0},"Joelwang22":{"docs":0,"functional-code":0,"test-code":0},"bertrandong":{"docs":27,"functional-code":0,"test-code":0}},"authorContributionVariance":{"nigel27022001":0.0,"chonghaoen":0.0,"0-yibai":0.0,"Joelwang22":0.0,"bertrandong":125.25443},"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-T09-2_tp_master/authorship.json b/AY2324S2-CS2103T-T09-2_tp_master/authorship.json index fe51488c..9082282b 100644 --- a/AY2324S2-CS2103T-T09-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T09-2_tp_master/authorship.json @@ -1 +1 @@ -[] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailinteoo"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T09-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T09-2/tp/graph/badge.svg?token\u003dBMICX593IT)](https://codecov.io/gh/AY2324S2-CS2103T-T09-2/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kailinteoo"},"content":"# Introduction","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"kailinteoo"},"content":"Welcome to BookKeeper, your solution for efficient customer management for **small business owners in the crochet","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"kailinteoo"},"content":"industry**. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"kailinteoo"},"content":"This application is designed to streamline customer lists and enhance productivity for individuals operating","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"kailinteoo"},"content":"small businesses with limited resources and manpower. With BookKeeper, you can easily manage customer information, track","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"kailinteoo"},"content":"orders, and personalize your customer interactions, all through a user-friendly command-line interface.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"kailinteoo"},"content":"For the detailed documentation of this project, see the [BookKeeper](https://ay2324s2-cs2103t-t09-2.github.io/tp/).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kailinteoo"},"content":"# Acknowledgement","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"kailinteoo"},"content":"The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":" contact details.","lastModifiedDate":"2024-02-17"},{"lineNumber":21,"author":{"gitId":"kailinteoo"},"content":"* It is written in OOP fashion. ","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"kailinteoo"},"content":"* It provides a reasonably well-written code base bigger (around 6 KLoC)","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"kailinteoo"},"content":"* It comes with a reasonable level of user and developer documentation.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"kailinteoo"},"content":"This project is based on the AddressBook Level-3 project and is a part of the [se-education.org](https://se-education.org/addressbook-level3) initiative.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"kailinteoo"},"content":"# Features","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"kailinteoo"},"content":"## Customer Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"kailinteoo"},"content":"### 1. Add Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"kailinteoo"},"content":"Adds a customer to the customer\u0027s storage.","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"kailinteoo"},"content":"Example: `add \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"kailinteoo"},"content":"Successfully added \u003ccustomer name\u003e to your list!","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"kailinteoo"},"content":"### 2. Delete Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"kailinteoo"},"content":"Delete selected customer from the customer\u0027s storage.","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"kailinteoo"},"content":"Example: `delete \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"kailinteoo"},"content":"Successfully removed \u003ccustomer name\u003e from the list","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"kailinteoo"},"content":"### 3. Edit Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"kailinteoo"},"content":"Edit selected customer information by adding more information such as Age, Phone Number, Past purchased record, ","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"kailinteoo"},"content":"Birthday, Address.","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"kailinteoo"},"content":"Example: `edit \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"kailinteoo"},"content":"Successfully edit \u003ccustomer name\u003e information","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"kailinteoo"},"content":"### 4. VIP Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"kailinteoo"},"content":"Indicating that this specific customer is important.","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"kailinteoo"},"content":"Example: `vip \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"kailinteoo"},"content":"Successfully set \u003ccustomer name\u003e as VIP","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"kailinteoo"},"content":"## Order Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"kailinteoo"},"content":"### 1. Add Order","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"kailinteoo"},"content":"Adds a order into the order\u0027s storage, together with the customer name.","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"kailinteoo"},"content":"Example: `add \u003ccustomer name, order, due date\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"kailinteoo"},"content":"An order has been added for \u003ccustomer name\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"kailinteoo"},"content":"### 2. Delete Order","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"kailinteoo"},"content":"Delete order of the specific customer.","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"kailinteoo"},"content":"Example: `delete \u003ccustomer name, order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"kailinteoo"},"content":"\u003ccustomer name\u003e order of \u003c(order item)\u003e has been cancelled","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"kailinteoo"},"content":"### 3. Edit Order","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"kailinteoo"},"content":"Edit the customer\u0027s order.","lastModifiedDate":"2024-03-06"},{"lineNumber":96,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":97,"author":{"gitId":"kailinteoo"},"content":"Example: `edit \u003ccustomer name, old order, new order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":99,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"kailinteoo"},"content":"Successfully edit \u003ccustomer name\u003e order","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"kailinteoo"},"content":"### 4. Prioritize Order","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"kailinteoo"},"content":"Prioritize the customer\u0027 order.","lastModifiedDate":"2024-03-06"},{"lineNumber":106,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"kailinteoo"},"content":"Example: `prioritize \u003ccustomer name, order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":108,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":110,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":111,"author":{"gitId":"kailinteoo"},"content":"Successfully prioritized \u003ccustomer name, order\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":112,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":113,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":114,"author":{"gitId":"kailinteoo"},"content":"## Viewing Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":115,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":116,"author":{"gitId":"kailinteoo"},"content":"### 1. View Customer Detail","lastModifiedDate":"2024-03-06"},{"lineNumber":117,"author":{"gitId":"kailinteoo"},"content":"View customer information, such as Name, Age, Phone Number, Past purchase record, Birthday, Address.","lastModifiedDate":"2024-03-06"},{"lineNumber":118,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":119,"author":{"gitId":"kailinteoo"},"content":"Example: `view \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":120,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":121,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":122,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"kailinteoo"},"content":"Jasper Tan info: [...]","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"kailinteoo"},"content":"Tan Qing Yong info : [...]","lastModifiedDate":"2024-03-06"},{"lineNumber":125,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":127,"author":{"gitId":"kailinteoo"},"content":"### 2. View Order Detail","lastModifiedDate":"2024-03-06"},{"lineNumber":128,"author":{"gitId":"kailinteoo"},"content":"View Order information, such as order by when, who order, quantity.","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":130,"author":{"gitId":"kailinteoo"},"content":"Example: `view \u003corder\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":131,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":132,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":133,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":134,"author":{"gitId":"kailinteoo"},"content":"Frog Crochet: ","lastModifiedDate":"2024-03-06"},{"lineNumber":135,"author":{"gitId":"kailinteoo"},"content":"1. total of \u003cquantity\u003e order by \u003ccustomer name\u003e on \u003cdate\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":136,"author":{"gitId":"kailinteoo"},"content":"2. total of \u003cquantity\u003e order by \u003ccustomer name\u003e on \u003cdate\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":137,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":138,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":139,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":140,"author":{"gitId":"kailinteoo"},"content":"### 3. View Statistics","lastModifiedDate":"2024-03-06"},{"lineNumber":141,"author":{"gitId":"kailinteoo"},"content":"Show how many orders has been completed.","lastModifiedDate":"2024-03-06"},{"lineNumber":142,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":143,"author":{"gitId":"kailinteoo"},"content":"Example: `stat`","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":145,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":146,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":147,"author":{"gitId":"kailinteoo"},"content":"\u003ca list of stat\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"kailinteoo"},"content":"### 4. View Ranking","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"kailinteoo"},"content":"View which crochet sell the best and total sell quantity.","lastModifiedDate":"2024-03-06"},{"lineNumber":152,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":153,"author":{"gitId":"kailinteoo"},"content":"Example: `view ranking`","lastModifiedDate":"2024-03-06"},{"lineNumber":154,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":155,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"kailinteoo"},"content":"Top 1: Frog Crochet, total sold of \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":158,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":159,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"kailinteoo"},"content":"## Sorting Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":163,"author":{"gitId":"kailinteoo"},"content":"### 1. Sort Order by Date","lastModifiedDate":"2024-03-06"},{"lineNumber":164,"author":{"gitId":"kailinteoo"},"content":"Sort when the order is due based on the date (excluding prioritize order).","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"kailinteoo"},"content":"Example: `sort orderdate`","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan, frog crochet, 24 Feb 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"kailinteoo"},"content":"2. Tan Qin Yong, pig crochet, 1 Apr 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"kailinteoo"},"content":"### 2. Sort Order by order type","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"kailinteoo"},"content":"Sort depending on what kind of order.","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"kailinteoo"},"content":"Example: `sort ordertype`","lastModifiedDate":"2024-03-06"},{"lineNumber":179,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":180,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":182,"author":{"gitId":"kailinteoo"},"content":"Frog Crochet:","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan, 24 Feb 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"kailinteoo"},"content":"2. QinYong, 1 Apr 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":186,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":187,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"kailinteoo"},"content":"### 3. Sort Customer name by alphabetical order","lastModifiedDate":"2024-03-06"},{"lineNumber":189,"author":{"gitId":"kailinteoo"},"content":"sort the customer list.","lastModifiedDate":"2024-03-06"},{"lineNumber":190,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"kailinteoo"},"content":"Example: `sort customer`","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":194,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":195,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan","lastModifiedDate":"2024-03-06"},{"lineNumber":196,"author":{"gitId":"kailinteoo"},"content":"2. Tan Qing Yong ","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":199,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":200,"author":{"gitId":"kailinteoo"},"content":"## Notification/ Reminder/ Deadline/ Progress Tracker","lastModifiedDate":"2024-03-06"},{"lineNumber":201,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":202,"author":{"gitId":"kailinteoo"},"content":"### 1. Deadline approaching soon for an order (within a week)","lastModifiedDate":"2024-03-06"},{"lineNumber":203,"author":{"gitId":"kailinteoo"},"content":"Send notification when order is due within a week.","lastModifiedDate":"2024-03-06"},{"lineNumber":204,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":205,"author":{"gitId":"kailinteoo"},"content":"### 2. Progress Bar","lastModifiedDate":"2024-03-06"},{"lineNumber":206,"author":{"gitId":"kailinteoo"},"content":"Show how many order left to be done.","lastModifiedDate":"2024-03-06"},{"lineNumber":207,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":208,"author":{"gitId":"kailinteoo"},"content":"Example: `progress`","lastModifiedDate":"2024-03-06"},{"lineNumber":209,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":210,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":211,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":212,"author":{"gitId":"kailinteoo"},"content":"Left \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":213,"author":{"gitId":"kailinteoo"},"content":"Done \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":214,"author":{"gitId":"kailinteoo"},"content":"Pending \u003cQuantity\u003e\"","lastModifiedDate":"2024-03-06"},{"lineNumber":215,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":216,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":217,"author":{"gitId":"kailinteoo"},"content":"## Usage Help","lastModifiedDate":"2024-03-06"},{"lineNumber":218,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":219,"author":{"gitId":"kailinteoo"},"content":"### 1. Autocomplete","lastModifiedDate":"2024-03-06"},{"lineNumber":220,"author":{"gitId":"kailinteoo"},"content":"Show all possible next commands based on currently keyed in values.","lastModifiedDate":"2024-03-06"},{"lineNumber":221,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":222,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":223,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":224,"author":{"gitId":"kailinteoo"},"content":"/modi(fy)","lastModifiedDate":"2024-03-06"},{"lineNumber":225,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":226,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":227,"author":{"gitId":"kailinteoo"},"content":"### 2. User manual","lastModifiedDate":"2024-03-06"},{"lineNumber":228,"author":{"gitId":"kailinteoo"},"content":"Shows a list of commands that can be used.","lastModifiedDate":"2024-03-06"},{"lineNumber":229,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":230,"author":{"gitId":"kailinteoo"},"content":"Example: `help`","lastModifiedDate":"2024-03-06"},{"lineNumber":231,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":232,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":233,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":234,"author":{"gitId":"kailinteoo"},"content":"Commands list: ","lastModifiedDate":"2024-03-06"},{"lineNumber":235,"author":{"gitId":"kailinteoo"},"content":"1. add. Adds a new customer to the list. Example: \"add...\" ","lastModifiedDate":"2024-03-06"},{"lineNumber":236,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":237,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":238,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"kailinteoo":232,"-":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailinteoo"},"content":"# About Us:","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"kailinteoo"},"content":"Welcome to BookKeeper, your trusted companion in customer management for small crochet businesses. We understand the ","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"kailinteoo"},"content":"challenges faced by entrepreneurs like you who are passionate about crafting beautiful items and connecting with","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"kailinteoo"},"content":"customers. BookKeeper is here to simplify your workflow, empower your business, and help you thrive in the world of","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"kailinteoo"},"content":"crochet!","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kailinteoo"},"content":"## Product Name: BookKeeper","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"kailinteoo"},"content":"## Target Users","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"kailinteoo"},"content":"Our target users are small business owners across various industries who are looking for efficient ways to manage their ","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"kailinteoo"},"content":"customer lists and streamline their customer management processes. These individuals typically operate businesses with ","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"kailinteoo"},"content":"limited resources and manpower, making it essential for them to optimize their workflows and maximize productivity.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":14,"author":{"gitId":"kailinteoo"},"content":"## Purpose","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"kailinteoo"},"content":"In the bustling world of a small business, time is precious. BookKeeper aims to provide a seamless solution for managing","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"kailinteoo"},"content":"customer relationships, allowing you to focus on what matters most - creating and selling your craft. Our platform","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kailinteoo"},"content":"offers a user-friendly interface and powerful features to streamline your workflow, saving your time and effort.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"kailinteoo"},"content":"## Unique Selling Point","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"kailinteoo"},"content":"### Centralized Platform","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"kailinteoo"},"content":"Say goodbye to scattered customer lists and spreadsheets. BookKeeper offers a centralized platform to store and search","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"kailinteoo"},"content":"for clients, keeping all your important information in one place.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"kailinteoo"},"content":"### Efficiency","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"kailinteoo"},"content":"With a command-line interface, our application is faster and more efficient than traditional methods like CRMs or","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"kailinteoo"},"content":"Excel sheets. Spend less time navigating complex menus and more time serving your customers.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"kailinteoo"},"content":"### Tailored for Crochet Businesses","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"kailinteoo"},"content":"We understand the unique needs of crochet businesses, which is why our platform offers customizable fields, customizable","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"kailinteoo"},"content":"tags, and integration with e-commerce platforms.","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"kailinteoo"},"content":"### Cost-effective","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"kailinteoo"},"content":"BookKeeper is designed to be cost-effective and easy to use, perfect for businesses with limited resources. Maximize","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"kailinteoo"},"content":"productivity without breaking the bank.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"kailinteoo"},"content":"## Value Proposition","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"kailinteoo"},"content":"For small business owners launching services, organizing customer lists can be challenging. Our address book offers a ","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"kailinteoo"},"content":"centralized platform to store and search for clients, streamlining customer management. With a command-line interface, ","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"kailinteoo"},"content":"our application is faster and more efficient than inputting data into other systems like CRMs or Microsoft Excel.","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"kailinteoo"},"content":"## Team Information","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"kailinteoo"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"kailinteoo"},"content":"You can reach us at the email ","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"kailinteoo"},"content":"`jaspertan@u.nus.edu` `e0967851@u.nus.edu` `ian.tung@u.nus.edu` `e0959354@u.nus.edu`","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"kailinteoo"},"content":"## Project team","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"kailinteoo"},"content":"### Jasper Tan Zu Xiang","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/jaspetzx.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"kailinteoo"},"content":"[[github](https://github.com/Jaspertzx)]","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"kailinteoo"},"content":"* Role: Front-End Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Specialize in creating the user interface and user experience of the BookKeeper application. Ensure ","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"kailinteoo"},"content":"that the application is visually appealing, responsive, and easy to navigate for users.","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"kailinteoo"},"content":"### Goh Ying Xuan, Shavonne","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/shavonneg.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/shavonneg)]","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"kailinteoo"},"content":"* Role: UI/UX Designer","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Creating a seamless and intuitive user experience for the BookKeeper application. Conduct user","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"kailinteoo"},"content":"research, create wireframes and prototypes, and design user interfaces that are visually appealing and easy to use. ","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"kailinteoo"},"content":"### Tung Zhi Yong, Ian","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/rertyy.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/rertyy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"kailinteoo"},"content":"* Role: Full-Stack Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Proficient in both front-end and back-end development. Handle tasks ranging from designing user","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"kailinteoo"},"content":"interfaces to implementing server-side logic and managing database.","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"kailinteoo"},"content":"### Kailin Teo","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/kailinteoo.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/kailinteoo)]","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"kailinteoo"},"content":"* Role: Back-End Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Focus on building the server-side components of the BookKeeper application. Handle tasks such as","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"kailinteoo"},"content":"implementing business logic, managing databases, and ensuring the security and scalability of the application. ","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"kailinteoo":67,"-":23}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"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":"Jaspertzx"},"content":"| Priority | As a … | I want to … | So that I can… |","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"Jaspertzx"},"content":"|----------|---------------------------------------------|------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | easily add new customers to my address book | keep track of all my clients\u0027 information in one place. |","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crocheter | have a search function | quickly find specific customers when I need to reference their details. |","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Busy entrepreneur | be accessible via a command-line interface | efficiently manage my customer list without navigating through complex menus. |","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crochet business owner | have customizable fields | record specific details about each customer, such as their favorite colors or special requests. |","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | be cost-effective and easy to use | maximize productivity without investing in expensive CRM systems. |","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crochet business owner | have data backup and synchronization capabilities | access my customer information from multiple devices and ensure its security. |","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | have secure access controls and permissions settings | restrict sensitive information and ensure data privacy compliance. |","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Crochet business owner | categorize my customers | tailor my marketing efforts accordingly based on factors like their preferred crochet items or past purchases. |","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | generate reports on customer activity | analyze trends and make informed business decisions based on order history and frequency of purchases. |","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | have a reminder feature | stay organized and follow up with customers on important dates, such as birthdays or anniversaries. |","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | have customizable templates for invoices and receipts | easily generate and send professional-looking documents to my customers. |","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Crocheter offering custom orders | have a notes section for each customer | record specific preferences and requirements for their projects. |","lastModifiedDate":"2024-03-05"},{"lineNumber":292,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | integrate with accounting software | easily track expenses related to each customer and maintain accurate financial records. |","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a mobile-friendly interface | easily access customer information on the go and process orders efficiently. |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with my email client | send personalized messages and promotions to my customers directly from the platform. |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with e-commerce platforms | automatically sync customer data and manage orders efficiently when participating in online marketplaces. |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | track communication history with customers | provide personalized and timely customer service including emails and phone calls. |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | support multiple user accounts with shared access | my team members can collaborate on managing customer relationships. |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a scheduling feature | manage registrations and communicate updates with attendees seamlessly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a feature for scanning and capturing customer contact information | grow my mailing list and follow up with potential leads quickly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with social media platforms | easily connect with customers and engage with them through various channels. |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | provide insights into customer demographics and preferences | tailor my product offerings and marketing campaigns to target specific audiences effectively. |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Small business owner | provide analytics and insights on customer behavior | continuously improve my products and services to meet customer needs based on purchase patterns and feedback. |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | provide insights into customer satisfaction through feedback and reviews | address any concerns and improve the overall customer experience. |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Small business owner | offer customizable tags or labels for customers | segment my audience and target specific groups with tailored marketing campaigns. |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Busy entrepreneur | have a good out of the box experience | immediately use the application without needing to configure it for my own needs. |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"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":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"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":341,"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":342,"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":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":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":349,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"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":358,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"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":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"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":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"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":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"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":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"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":392,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Jaspertzx":28,"-":374}}] diff --git a/AY2324S2-CS2103T-T09-2_tp_master/commits.json b/AY2324S2-CS2103T-T09-2_tp_master/commits.json index 0c280fd9..f652abaa 100644 --- a/AY2324S2-CS2103T-T09-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T09-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"kailinteoo":[],"shavonneg":[],"rertyy":[],"Jaspertzx":[]},"authorFileTypeContributionMap":{"kailinteoo":{"docs":0,"functional-code":0,"test-code":0},"shavonneg":{"docs":0,"functional-code":0,"test-code":0},"rertyy":{"docs":0,"functional-code":0,"test-code":0},"Jaspertzx":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"kailinteoo":0.0,"shavonneg":0.0,"rertyy":0.0,"Jaspertzx":0.0},"authorDisplayNameMap":{"kailinteoo":"CS2103T-T09-2 KAIL.. TEO","shavonneg":"CS2103T-T09-2 GOH ..ONNE","rertyy":"CS2103T-T09-2 TUNG.. IAN","Jaspertzx":"CS2103T-T09-2 JASP..IANG"}} +{"authorDailyContributionsMap":{"kailinteoo":[{"date":"2024-03-06","commitResults":[{"hash":"a744f151cd8a507f50a1383abe87b7df1385297e","isMergeCommit":false,"messageTitle":"Update AboutUs and README pages, add UI mockup and build status badge","messageBody":"AboutUs Page:\n- Updated team member details and roles\n- Added profile photos for each member\n- Followed specified format for photo filenames\n\nREADME Page:\n- Updated project details and content to match project\n- Added UI mockup image as docs/images/Ui.png\n\nBuild Status Badge:\n- Updated GitHub Actions build status badge link to reflect team repo\u0027s build status\n\nAcknowledgement:\n- Acknowledged original source of code\n\nThis commit reflects updates made to various pages in the project repository to match our project details and specifications.\n","fileTypesAndContributionMap":{"docs":{"insertions":299,"deletions":51}}},{"hash":"abe2e20ffcfe3f81accf49fd79952588492bda9c","isMergeCommit":false,"messageTitle":"Update README with project details","messageBody":"This commit reflects changes made to the README\nto update project details and information.\nThe README now accurately reflects our project and\nits specifications.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}},{"hash":"fb026213c29c5b2af1b3f556987bc19caa3747c0","isMergeCommit":true,"messageTitle":"Merge pull request #34 from Jaspertzx/master","messageBody":"Update User Stories","fileTypesAndContributionMap":{}}]}],"shavonneg":[],"rertyy":[],"Jaspertzx":[{"date":"2024-03-05","commitResults":[{"hash":"8756614a0c823f135b58cce0c52e4973404ef1d2","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"The user stories does not align with our overall\nobjective of creating a mini-CRM system.\n\nThis may make the overall project very confusing\nif other developers were to see the developer\nguide and not see the updated user stories.\n\nUpdate the user stories to match what my group\nis trying to attain.\n\nThis will be more accurate to what we would like\nto achieve the next few weeks, and also to meet\nthe requirements of this module.\n\nNo other reference.\n","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":8}}}]},{"date":"2024-03-06","commitResults":[{"hash":"63d17a7aafc0ec241a136fdda3d6821a45985120","isMergeCommit":true,"messageTitle":"Merge pull request #1","messageBody":"Update User Stories","fileTypesAndContributionMap":{}},{"hash":"1c8ad53b94ee17d57487e8d421ba4eb8acc86d77","isMergeCommit":true,"messageTitle":"Merge pull request #32 from kailinteoo/website-adapted","messageBody":"Update AboutUs and README pages","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"kailinteoo":{"docs":299,"functional-code":0,"test-code":0},"shavonneg":{"docs":0,"functional-code":0,"test-code":0},"rertyy":{"docs":0,"functional-code":0,"test-code":0},"Jaspertzx":{"docs":28,"functional-code":0,"test-code":0}},"authorContributionVariance":{"kailinteoo":10800.0,"shavonneg":0.0,"rertyy":0.0,"Jaspertzx":92.023674},"authorDisplayNameMap":{"kailinteoo":"CS2103T-T09-2 KAIL.. TEO","shavonneg":"CS2103T-T09-2 GOH ..ONNE","rertyy":"CS2103T-T09-2 TUNG.. IAN","Jaspertzx":"CS2103T-T09-2 JASP..IANG"}} diff --git a/AY2324S2-CS2103T-T09-4_tp_master/authorship.json b/AY2324S2-CS2103T-T09-4_tp_master/authorship.json index f198157b..60fb12d3 100644 --- a/AY2324S2-CS2103T-T09-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T09-4_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-T09-4/tp/graph/badge.svg?token\u003dWAIOG42WJK)](https://codecov.io/gh/AY2324S2-CS2103T-T09-4/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Jajared"},"content":"# TA Helper","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Jajared"},"content":"\u003e TA Helper is more than just a tool; it\u0027s your ultimate companion in navigating the complexities of teaching assistance in computer science modules. Embrace the simplicity and efficiency of managing your classes with TA Helper today!","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Jajared"},"content":"TA Helper is a comprehensive tool designed to significantly ease the administrative and organizational challenges faced by Teaching Assistants (TAs) handling computer science modules. With its core focus on facilitating the management of student groups and enhancing the efficiency of classroom administration, TA Helper stands as an essential platform for TAs who are tasked with overseeing numerous classes and students.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"Jajared"},"content":"## User Profile","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Jajared"},"content":"- **Target Users:** Teaching Assistants for Computer Science Modules","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"- **Key Challenges:**","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Jajared"},"content":" - Managing multiple classes and a diverse student body.","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":" - Forming student teams for projects or assignments while ensuring fairness.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":" - Keeping track of student details, progress, grades, and attendance across different modules.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Jajared"},"content":"## Problem Statement","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"Teaching Assistants often grapple with the complexities of generating and assigning students to teams within their classes. The situation is compounded when TAs manage multiple classes, necessitating a streamlined method to oversee various nominal rolls. A unified platform that provides a holistic view of all student information, across every class, is crucial for effective student management. Additionally, the random yet fair formation of student teams for assessments poses a significant challenge.","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"## Value Proposition","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"**TA Helper** offers a centralized and user-friendly solution for TAs to manage student information akin to a nominal roll. Its features are tailored to address the specific needs of TAs teaching computer science modules, including but not limited to:","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Jajared"},"content":"- **Centralized Student Information:** Store and access contact details and other vital information of students enrolled in the modules you teach, all in one place.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Jajared"},"content":"- **Progress Tracking:** Monitor and record the progress of each student, including grades and attendance, ensuring a comprehensive overview of each individual\u0027s academic journey.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Jajared"},"content":"- **Multiple Tabs for Different Modules:** Seamlessly manage different groups of students across various modules you\u0027re teaching, with dedicated tabs for each class.","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- **Random Team Generator:** Enhance fairness in assessments by utilizing the optional random team generator, which includes features for adding preferences to accommodate specific grouping needs.","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Jajared"},"content":"## Scope","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Jajared"},"content":"The primary scope of **TA Helper** includes:","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Jajared"},"content":"- Managing contact details of students for each module taught by a TA.","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Jajared"},"content":"- Additional functionalities to track student progress, input grades, and monitor attendance.","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Jajared"},"content":"- Optional feature to generate random teams for projects or assignments, considering fairness and preferences.","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"## Getting Started","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"To get started with TA Helper, follow these simple steps: To be updated","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Jajared"},"content":"## References","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Jajared"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"-":5,"Jajared":40}},{"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":"Jajared"},"content":"### Jared Wong","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/jajared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":"[[homepage](https://jajared.vercel.app/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":"[[github](https://github.com/Jajared)]","lastModifiedDate":"2024-02-25"},{"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":"Jajared"},"content":"- Role: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Overall project coordination and ensure the team is doing well.","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"### Zack Tay","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/zack-tay.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Zack-Tay"},"content":"[[github](http://github.com/Zack-Tay)]","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"### Tan Qin Xu","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/qinxutan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"qinxutan"},"content":"[[github](http://github.com/qinxutan)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"- Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Responsible for the quality of various project documents, including README, User Guide and Developer Guide.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"### Whelan Low","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"whelan-low"},"content":"\u003cimg src\u003d\"images/whelan-low.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"whelan-low"},"content":"[[github](http://github.com/whelan-low)]","lastModifiedDate":"2024-02-25"},{"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":"Jajared"},"content":"- Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Ensure project deliverables are done on time and in the right format. In charge of submitting the deliverables","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Jajared"},"content":"### Mahadhir","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"mahadhir247"},"content":"\u003cimg src\u003d\"images/mahadhir247.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"mahadhir247"},"content":"[[github](http://github.com/mahadhir247)]","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":1,"Zack-Tay":1,"-":34,"Jajared":20,"mahadhir247":2,"whelan-low":2}},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"Jajared"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"Jajared"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"Jajared"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"Jajared"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"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-05"},{"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":"Jajared"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"Jajared"},"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-05"},{"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":"Jajared"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"Jajared"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-05"},{"lineNumber":83,"author":{"gitId":"Jajared"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":84,"author":{"gitId":"Jajared"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":117,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":118,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":130,"author":{"gitId":"Jajared"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"Jajared"},"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-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"Jajared"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":151,"author":{"gitId":"Jajared"},"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-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"Jajared"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"Jajared"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"Jajared"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":265,"author":{"gitId":"Jajared"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":266,"author":{"gitId":"Jajared"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":267,"author":{"gitId":"Jajared"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":268,"author":{"gitId":"Jajared"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- has a need to manage a significant number of students\u0027 contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"Jajared"},"content":"- prefer desktop apps over other types","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"Jajared"},"content":"- can type fast","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"Jajared"},"content":"- prefers typing to mouse interactions","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"Jajared"},"content":"- is reasonably comfortable using CLI apps","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"qinxutan"},"content":"**Value proposition**: manage students\u0027contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-02-25"},{"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":"qinxutan"},"content":"|----------|---------|--------------------------------------------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-02-25"},{"lineNumber":292,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add new students to a class | maintain an up-to-date list of enrolled students. |","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add partial info of students | still add students even if I don’t have all their information. |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | delete a student from my class if they drop the module/class | keep my class list accurate and up-to-date. |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"qinxutan"},"content":"| `* * ` | TA | search for my students based on their NUS ID, emails, names or tutorial groups | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-02-25"},{"lineNumber":296,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all students and their particulars | have a comprehensive overview of the enrolled students in my class. |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"qinxutan"},"content":"| `* *` | TA | add/remove different modules I am teaching | manage my teaching assignments efficiently. |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all the tutorial classes and their information | visibility into the schedule and details of all tutorial classes. |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":300,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"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":"qinxutan"},"content":"(For all use cases below, the **System** is the `TA Helper` and the **Actor** is the `TA`, unless specified otherwise)","lastModifiedDate":"2024-02-25"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":306,"author":{"gitId":"Jajared"},"content":"#### Use case 1: Add new students","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":308,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"Jajared"},"content":"1. User specifies the student to be added.","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"Jajared"},"content":"2. System adds the student to the list of students.","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"Jajared"},"content":"3. System indicates successful addition of new student.","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"Jajared"},"content":"- 1a. Student\u0027s name, email, id is not specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"Jajared"},"content":" - 1a1. Returns an error that informs the user to specify the missing field(s).","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"Jajared"},"content":"- 1b. The specified email and/or id is tagged to an existing student in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"Zack-Tay"},"content":" - 1b1. Returns an error indicating that there is an existing entry with the same value.","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"Jajared"},"content":"- 1c. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"Jajared"},"content":" - 1c1. Return an error indicating that command is not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"Jajared"},"content":"- 2a. Student\u0027s tutorial class is not specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"Jajared"},"content":" - 2a1. System adds student into the list of students.","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"Zack-Tay"},"content":" - 2a2. Student will not be placed under any tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Jajared"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Jajared"},"content":"#### Use case 2: Delete students","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":335,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/delete_student` and specifies the student to be deleted by the specified parameter.","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"Jajared"},"content":"2. System deletes the student from the list of students and tutorial group (if any).","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Jajared"},"content":"- 1a. User specifies to delete student by student ID.","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"Jajared"},"content":" - 1a1. Student ID does not exist in the system.","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"Jajared"},"content":" - 1a1.1: Returns an error indicating that the student with the provided ID does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"Jajared"},"content":"- 1b. User specifies to delete student by email.","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"Jajared"},"content":" - 1b1. Email does not exist in the system.","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"Jajared"},"content":" - 1b1.1. Returns an error indicating that the student with the provided email does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Jajared"},"content":"- 1c. Invalid input command. - 1c1: Returns an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Jajared"},"content":"#### Use case 3: Search for students","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/search_student` and specifies the student to be searched by the specified parameter.","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"Jajared"},"content":"2. System generates a list of matching entries according to specified parameters.","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"Jajared"},"content":"- 1a. Parameter not specified","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"Jajared"},"content":" - 1a1/2a1. Returns an error indicating that the user needs to specify valid fields.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Jajared"},"content":"- 1b. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"Jajared"},"content":" - 1b1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"Jajared"},"content":"- 2a. Partial match for specified parameter. - 2a1. System will display all matching results for the specified value.","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"Jajared"},"content":"#### Use case 4: View all students","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":375,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"Jajared"},"content":"2. System displays all students information (name, email, student id and tutorial class).","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"Jajared"},"content":"- 1b. Additional arguments are specified after the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"Jajared"},"content":" - 1b1. System will ignore those arguments and execute /list_students as usual.","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"Jajared"},"content":"- 2a. No existing students in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"Jajared"},"content":" - 2a1. System will return a message indicating that there are no students in the list. ","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Jajared"},"content":"#### Use case 5: Add new tutorial class","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":394,"author":{"gitId":"whelan-low"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/add_class` and specifies the tutorial class details to be added.","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"Jajared"},"content":"2. System adds the tutorial class.","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":400,"author":{"gitId":"whelan-low"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":401,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":402,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"Jajared"},"content":"- 1b. Invalid tutorial class attributes are specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"Jajared"},"content":" - 2a1. Returns an error indicating that user has to specify tutorial class in the correct format.","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"Jajared"},"content":"- 1c. The specified tutorial class already exists. - 1c1: Returns an error indicating that the tutorial class already exists. - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"Jajared"},"content":"#### Use case 6: Delete tutorial class","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"Jajared"},"content":"**MSS:**","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/delete_class` and specifies the tutorial class to be deleted.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"Jajared"},"content":"2. System deletes the tutorial class.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"Jajared"},"content":"- 1b. The tutorial class specified does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"Jajared"},"content":" - 1b1. Returns an error indicating invalid tutorial class and shows the list of tutorial classes available.","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"Jajared"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"Jajared"},"content":"#### Use case 7: View all classes","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"Jajared"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/list_class`.","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"Jajared"},"content":"2. System shows a list of all available classes.","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"Jajared"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"Jajared"},"content":"- 1b. Additional arguments are specified after the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"Jajared"},"content":" - 1b1. System will ignore those arguments and execute /list_students as usual.","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"Jajared"},"content":"- 2a. There are no existing classes.","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"Jajared"},"content":" - 2a1. System will return a message indicating that there are no existing classes in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"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":452,"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":453,"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":454,"author":{"gitId":"Zack-Tay"},"content":"4. Should respond to user inputs within approximately 2-3 seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"Zack-Tay"},"content":"5. Should not depend on internet access to accomplish its core purpose.","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"Zack-Tay"},"content":"6. Should provide a simple and user-friendly GUI, focusing on readability and ease of use.","lastModifiedDate":"2024-03-05"},{"lineNumber":457,"author":{"gitId":"Zack-Tay"},"content":"7. Should be usable by a person who is TA-ing for the first time.","lastModifiedDate":"2024-03-05"},{"lineNumber":458,"author":{"gitId":"Zack-Tay"},"content":"8. Should provide comprehensive error messages and guidelines to recover from errors due to user input.","lastModifiedDate":"2024-03-05"},{"lineNumber":459,"author":{"gitId":"Zack-Tay"},"content":"9. Should provide a comprehensive and well-designed user documentation to guide users on how to use TAHelper.","lastModifiedDate":"2024-03-05"},{"lineNumber":460,"author":{"gitId":"Zack-Tay"},"content":"10. Should provide a comprehensive and well-designed developer documentation to guide developer on how to improve and develop TAHelper further.","lastModifiedDate":"2024-03-05"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"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":"Zack-Tay"},"content":"* **TA (Teaching Assistant)**: An individual who is responsible for teaching a tutorial class of University students.","lastModifiedDate":"2024-03-05"},{"lineNumber":469,"author":{"gitId":"Zack-Tay"},"content":"* **TAHelper**: A contact management application to help TAs keep track of students in classes they teach","lastModifiedDate":"2024-03-05"},{"lineNumber":470,"author":{"gitId":"Zack-Tay"},"content":"* **GUI**: Graphical User Interface","lastModifiedDate":"2024-03-05"},{"lineNumber":471,"author":{"gitId":"Zack-Tay"},"content":"* **MSS**: Main Success Scenario","lastModifiedDate":"2024-03-05"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":481,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":482,"author":{"gitId":"Jajared"},"content":"testers are expected to do more _exploratory_ testing.","lastModifiedDate":"2024-03-05"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"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":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"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":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"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":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"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":516,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"qinxutan":14,"Zack-Tay":32,"-":333,"Jajared":143,"whelan-low":4}},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":" - `list` : Lists all contacts.","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":" - `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"Jajared"},"content":" - `clear` : Deletes all contacts.","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":" - `exit` : Exits the app.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2024-03-05"},{"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":"qinxutan"},"content":"### Adding new students : `add`","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"Jajared"},"content":"### Deleting students : `delete_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"Jajared"},"content":"Delete a student contact based on the parameter specified by the user.","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"Jajared"},"content":"Format: `/delete_student id/STUDENT_ID email/EMAIL`","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"Jajared"},"content":"- The following parameters to delete a student contact are supported:","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"Jajared"},"content":" 1. Student ID","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"Jajared"},"content":" 2. Email","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"Jajared"},"content":"- Leading/trailing spaces are removed","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"Jajared"},"content":"- The parameter is case insensitive","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"Jajared"},"content":"- If none of the paremeters or an invalid parameter is specified, the command will return an error message indicating that a valid parameter must be provided.","lastModifiedDate":"2024-03-05"},{"lineNumber":83,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":84,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"Jajared"},"content":"Upon successful deletion, the command will return a confirmation messaging stating that the specified student contact has been removed.","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":87,"author":{"gitId":"Jajared"},"content":"Examples:","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"Jajared"},"content":"- Delete by student ID: `/delete_student id/A01234567X`","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"Jajared"},"content":"- Delete by email: `/delete_student email/e0123456@u.nus.edu`","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":92,"author":{"gitId":"qinxutan"},"content":"### Searching for students : `search`","lastModifiedDate":"2024-02-25"},{"lineNumber":93,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"Jajared"},"content":"### Listing all students : `list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"Jajared"},"content":"View the list of all students available","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":98,"author":{"gitId":"Jajared"},"content":"Format: `/list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":99,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":101,"author":{"gitId":"Jajared"},"content":"The command will display the list of all students along with their student information. If there are no existing students, the command will return a message indicating that there are no students currently.","lastModifiedDate":"2024-03-05"},{"lineNumber":102,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"whelan-low"},"content":"### Adding new tutorial class : `add_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"whelan-low"},"content":"Adds a tutorial class with the specified module code and name.","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"whelan-low"},"content":"Format: `/add_class MODULE_CODE TUTORIAL_CLASS`","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"whelan-low"},"content":"- If none of the parameters is specified, or if only one is specified, returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":112,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"whelan-low"},"content":"- `/add_class CS2103T T10`","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"whelan-low"},"content":"- `/add_class CS2109S T01`","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"whelan-low"},"content":"### Deleting tutorial class : `delete_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"whelan-low"},"content":"Deletes a specified tutorial class from the list of classes.","lastModifiedDate":"2024-02-29"},{"lineNumber":119,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":120,"author":{"gitId":"whelan-low"},"content":"Format: `/delete_class MODULE_CODE TUTORIAL_CLASS`","lastModifiedDate":"2024-02-29"},{"lineNumber":121,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":122,"author":{"gitId":"whelan-low"},"content":"- If the module code does not exist, it returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"whelan-low"},"content":"- If the tutorial class within that module code does not exist, it returns an error and the list of tutorial classes in that module code.","lastModifiedDate":"2024-02-29"},{"lineNumber":124,"author":{"gitId":"whelan-low"},"content":"- If no parameters are specified, returns an error","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":128,"author":{"gitId":"whelan-low"},"content":"- `/delete_class CS2103T T10`","lastModifiedDate":"2024-02-29"},{"lineNumber":129,"author":{"gitId":"whelan-low"},"content":"- `/delete_class CS2109S T01`","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"qinxutan"},"content":"### Listing all classes: `list`","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"qinxutan"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":135,"author":{"gitId":"qinxutan"},"content":"Format: `list_class`","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"qinxutan"},"content":"**BELOW ARE JUST FORMATS FROM ORIGINAL AD3.","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"qinxutan"},"content":"DELETE AFT LAST PERSON IS DONE WITH FEATURES.**","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":156,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":161,"author":{"gitId":"Jajared"},"content":"- `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"Jajared"},"content":"- `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"Jajared"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-05"},{"lineNumber":172,"author":{"gitId":"Jajared"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-03-05"},{"lineNumber":173,"author":{"gitId":"Jajared"},"content":"- When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-05"},{"lineNumber":174,"author":{"gitId":"Jajared"},"content":"- You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2024-03-05"},{"lineNumber":175,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":179,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":180,"author":{"gitId":"Jajared"},"content":"- `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-03-05"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"Jajared"},"content":"- The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":189,"author":{"gitId":"Jajared"},"content":"- The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"Jajared"},"content":"- Only the name is searched.","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"Jajared"},"content":"- Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"Jajared"},"content":"- Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-05"},{"lineNumber":193,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"Jajared"},"content":"- `find John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"Jajared"},"content":"- `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":199,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"Jajared"},"content":"- Deletes the person at the specified `INDEX`.","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"Jajared"},"content":"- The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"Jajared"},"content":"- The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-05"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":213,"author":{"gitId":"Jajared"},"content":"- `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":214,"author":{"gitId":"Jajared"},"content":"- `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2024-03-05"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"qinxutan"},"content":"### Viewing all classes","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"qinxutan"},"content":"Shows all tutorial classes available.","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"qinxutan"},"content":"Format: `list`","lastModifiedDate":"2024-02-25"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"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":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"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":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":247,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"Jajared"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"Jajared"},"content":"| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"Jajared"},"content":"| **Add New Students** | `add_student /name \u003cstudent_name\u003e /email \u003cstudent_email\u003e /id \u003cstudent_id\u003e /tc \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `add_student /name Dohn Joe /email johndoe@gmail.com /id A0123456A /tc CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":254,"author":{"gitId":"Jajared"},"content":"| **Delete students** | `delete_student \u003c/id, /email\u003e \u003cid or email\u003e`\u003cbr\u003e e.g., `delete_student /id A0259209B` or `/delete_student email johndoe@gmail.com` |","lastModifiedDate":"2024-03-05"},{"lineNumber":255,"author":{"gitId":"Jajared"},"content":"| **Search for students** | `search_student \u003c/id, /email, /tc, /name\u003e \u003csearch_query\u003e`\u003cbr\u003e e.g.,`search_student /id A0123456A` |","lastModifiedDate":"2024-03-05"},{"lineNumber":256,"author":{"gitId":"Jajared"},"content":"| **View all students** | `list_student` |","lastModifiedDate":"2024-03-05"},{"lineNumber":257,"author":{"gitId":"Jajared"},"content":"| **Add new tutorial class** | `add_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `add_class CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":258,"author":{"gitId":"Jajared"},"content":"| **Delete tutorial class** | `delete_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `delete_class CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":259,"author":{"gitId":"Jajared"},"content":"| **View all classes** | `list_class` |","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":19,"-":137,"Jajared":80,"whelan-low":23}}] +[{"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-T09-4/tp/graph/badge.svg?token\u003dWAIOG42WJK)](https://codecov.io/gh/AY2324S2-CS2103T-T09-4/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Jajared"},"content":"# TA Helper","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Jajared"},"content":"\u003e TA Helper is more than just a tool; it\u0027s your ultimate companion in navigating the complexities of teaching assistance in computer science modules. Embrace the simplicity and efficiency of managing your classes with TA Helper today!","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Jajared"},"content":"TA Helper is a comprehensive tool designed to significantly ease the administrative and organizational challenges faced by Teaching Assistants (TAs) handling computer science modules. With its core focus on facilitating the management of student groups and enhancing the efficiency of classroom administration, TA Helper stands as an essential platform for TAs who are tasked with overseeing numerous classes and students.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"Jajared"},"content":"## User Profile","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Jajared"},"content":"- **Target Users:** Teaching Assistants for Computer Science Modules","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"- **Key Challenges:**","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Jajared"},"content":" - Managing multiple classes and a diverse student body.","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":" - Forming student teams for projects or assignments while ensuring fairness.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":" - Keeping track of student details, progress, grades, and attendance across different modules.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Jajared"},"content":"## Problem Statement","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"Teaching Assistants often grapple with the complexities of generating and assigning students to teams within their classes. The situation is compounded when TAs manage multiple classes, necessitating a streamlined method to oversee various nominal rolls. A unified platform that provides a holistic view of all student information, across every class, is crucial for effective student management. Additionally, the random yet fair formation of student teams for assessments poses a significant challenge.","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"## Value Proposition","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"**TA Helper** offers a centralized and user-friendly solution for TAs to manage student information akin to a nominal roll. Its features are tailored to address the specific needs of TAs teaching computer science modules, including but not limited to:","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Jajared"},"content":"- **Centralized Student Information:** Store and access contact details and other vital information of students enrolled in the modules you teach, all in one place.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Jajared"},"content":"- **Progress Tracking:** Monitor and record the progress of each student, including grades and attendance, ensuring a comprehensive overview of each individual\u0027s academic journey.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Jajared"},"content":"- **Multiple Tabs for Different Modules:** Seamlessly manage different groups of students across various modules you\u0027re teaching, with dedicated tabs for each class.","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- **Random Team Generator:** Enhance fairness in assessments by utilizing the optional random team generator, which includes features for adding preferences to accommodate specific grouping needs.","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Jajared"},"content":"## Scope","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Jajared"},"content":"The primary scope of **TA Helper** includes:","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Jajared"},"content":"- Managing contact details of students for each module taught by a TA.","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Jajared"},"content":"- Additional functionalities to track student progress, input grades, and monitor attendance.","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Jajared"},"content":"- Optional feature to generate random teams for projects or assignments, considering fairness and preferences.","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"## Getting Started","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"To get started with TA Helper, follow these simple steps: To be updated","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Jajared"},"content":"## References","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Jajared"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"-":5,"Jajared":40}},{"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":"Jajared"},"content":"### Jared Wong","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/jajared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":"[[homepage](https://jajared.vercel.app/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":"[[github](https://github.com/Jajared)]","lastModifiedDate":"2024-02-25"},{"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":"Jajared"},"content":"- Role: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Overall project coordination and ensure the team is doing well.","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"### Zack Tay","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/zack-tay.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Zack-Tay"},"content":"[[github](http://github.com/Zack-Tay)]","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"### Tan Qin Xu","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/qinxutan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"qinxutan"},"content":"[[github](http://github.com/qinxutan)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"- Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Responsible for the quality of various project documents, including README, User Guide and Developer Guide.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"### Whelan Low","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"whelan-low"},"content":"\u003cimg src\u003d\"images/whelan-low.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"whelan-low"},"content":"[[github](http://github.com/whelan-low)]","lastModifiedDate":"2024-02-25"},{"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":"Jajared"},"content":"- Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Ensure project deliverables are done on time and in the right format. In charge of submitting the deliverables","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Jajared"},"content":"### Mahadhir","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"mahadhir247"},"content":"\u003cimg src\u003d\"images/mahadhir247.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"mahadhir247"},"content":"[[github](http://github.com/mahadhir247)]","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":1,"Zack-Tay":1,"-":34,"Jajared":20,"mahadhir247":2,"whelan-low":2}},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"Jajared"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"Jajared"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"Jajared"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"Jajared"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"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-05"},{"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":"Jajared"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"Jajared"},"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-05"},{"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":"Jajared"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"Jajared"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-05"},{"lineNumber":83,"author":{"gitId":"Jajared"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":84,"author":{"gitId":"Jajared"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":117,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":118,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":130,"author":{"gitId":"Jajared"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"Jajared"},"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-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"Jajared"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"Jajared"},"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-05"},{"lineNumber":151,"author":{"gitId":"Jajared"},"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-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"Jajared"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"Jajared"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"Jajared"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":265,"author":{"gitId":"Jajared"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":266,"author":{"gitId":"Jajared"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":267,"author":{"gitId":"Jajared"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":268,"author":{"gitId":"Jajared"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- has a need to manage a significant number of students\u0027 contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"Jajared"},"content":"- prefer desktop apps over other types","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"Jajared"},"content":"- can type fast","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"Jajared"},"content":"- prefers typing to mouse interactions","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"Jajared"},"content":"- is reasonably comfortable using CLI apps","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"qinxutan"},"content":"**Value proposition**: manage students\u0027contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-02-25"},{"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":"qinxutan"},"content":"|----------|---------|--------------------------------------------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-02-25"},{"lineNumber":292,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add new students to a class | maintain an up-to-date list of enrolled students. |","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add partial info of students | still add students even if I don’t have all their information. |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | delete a student from my class if they drop the module/class | keep my class list accurate and up-to-date. |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"qinxutan"},"content":"| `* * ` | TA | search for my students based on their NUS ID, emails, names or tutorial groups | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-02-25"},{"lineNumber":296,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all students and their particulars | have a comprehensive overview of the enrolled students in my class. |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"qinxutan"},"content":"| `* *` | TA | add/remove different modules I am teaching | manage my teaching assignments efficiently. |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all the tutorial classes and their information | visibility into the schedule and details of all tutorial classes. |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":300,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"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":"qinxutan"},"content":"(For all use cases below, the **System** is the `TA Helper` and the **Actor** is the `TA`, unless specified otherwise)","lastModifiedDate":"2024-02-25"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":306,"author":{"gitId":"Jajared"},"content":"#### Use case 1: Add new students","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":308,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"Jajared"},"content":"1. User specifies the student to be added.","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"Jajared"},"content":"2. System adds the student to the list of students.","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"Jajared"},"content":"3. System indicates successful addition of new student.","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"Jajared"},"content":"- 1a. Student\u0027s name, email, id is not specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"Jajared"},"content":" - 1a1. Returns an error that informs the user to specify the missing field(s).","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"Jajared"},"content":"- 1b. The specified email and/or id is tagged to an existing student in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"Zack-Tay"},"content":" - 1b1. Returns an error indicating that there is an existing entry with the same value.","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"Jajared"},"content":"- 1c. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"Jajared"},"content":" - 1c1. Return an error indicating that command is not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"Jajared"},"content":"- 2a. Student\u0027s tutorial class is not specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"Jajared"},"content":" - 2a1. System adds student into the list of students.","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"Zack-Tay"},"content":" - 2a2. Student will not be placed under any tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Jajared"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Jajared"},"content":"#### Use case 2: Delete students","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":335,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/delete_student` and specifies the student to be deleted by the specified parameter.","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"Jajared"},"content":"2. System deletes the student from the list of students and tutorial group (if any).","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Jajared"},"content":"- 1a. User specifies to delete student by student ID.","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"Jajared"},"content":" - 1a1. Student ID does not exist in the system.","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"Jajared"},"content":" - 1a1.1: Returns an error indicating that the student with the provided ID does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"Jajared"},"content":"- 1b. User specifies to delete student by email.","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"Jajared"},"content":" - 1b1. Email does not exist in the system.","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"Jajared"},"content":" - 1b1.1. Returns an error indicating that the student with the provided email does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Jajared"},"content":"- 1c. Invalid input command. - 1c1: Returns an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Jajared"},"content":"#### Use case 3: Search for students","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/search_student` and specifies the student to be searched by the specified parameter.","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"Jajared"},"content":"2. System generates a list of matching entries according to specified parameters.","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"Jajared"},"content":"- 1a. Parameter not specified","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"Jajared"},"content":" - 1a1/2a1. Returns an error indicating that the user needs to specify valid fields.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Jajared"},"content":"- 1b. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"Jajared"},"content":" - 1b1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"Jajared"},"content":"- 2a. Partial match for specified parameter. - 2a1. System will display all matching results for the specified value.","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"Jajared"},"content":"#### Use case 4: View all students","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":375,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"Jajared"},"content":"2. System displays all students information (name, email, student id and tutorial class).","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"Jajared"},"content":"- 1b. Additional arguments are specified after the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"Jajared"},"content":" - 1b1. System will ignore those arguments and execute /list_students as usual.","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"Jajared"},"content":"- 2a. No existing students in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"Jajared"},"content":" - 2a1. System will return a message indicating that there are no students in the list. ","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Jajared"},"content":"#### Use case 5: Add new tutorial class","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":394,"author":{"gitId":"whelan-low"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/add_class` and specifies the tutorial class details to be added.","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"Jajared"},"content":"2. System adds the tutorial class.","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":400,"author":{"gitId":"whelan-low"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":401,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":402,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"Jajared"},"content":"- 1b. Invalid tutorial class attributes are specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"Jajared"},"content":" - 2a1. Returns an error indicating that user has to specify tutorial class in the correct format.","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"Jajared"},"content":"- 1c. The specified tutorial class already exists. - 1c1: Returns an error indicating that the tutorial class already exists. - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"Jajared"},"content":"#### Use case 6: Delete tutorial class","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"Jajared"},"content":"**MSS:**","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/delete_class` and specifies the tutorial class to be deleted.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"Jajared"},"content":"2. System deletes the tutorial class.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"Jajared"},"content":"- 1b. The tutorial class specified does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"Jajared"},"content":" - 1b1. Returns an error indicating invalid tutorial class and shows the list of tutorial classes available.","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"Jajared"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"Jajared"},"content":"#### Use case 7: View all classes","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"Jajared"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/list_class`.","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"Jajared"},"content":"2. System shows a list of all available classes.","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"Jajared"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"Jajared"},"content":"- 1b. Additional arguments are specified after the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"Jajared"},"content":" - 1b1. System will ignore those arguments and execute /list_students as usual.","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"Jajared"},"content":"- 2a. There are no existing classes.","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"Jajared"},"content":" - 2a1. System will return a message indicating that there are no existing classes in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"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":452,"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":453,"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":454,"author":{"gitId":"Zack-Tay"},"content":"4. Should respond to user inputs within approximately 2-3 seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"Zack-Tay"},"content":"5. Should not depend on internet access to accomplish its core purpose.","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"Zack-Tay"},"content":"6. Should provide a simple and user-friendly GUI, focusing on readability and ease of use.","lastModifiedDate":"2024-03-05"},{"lineNumber":457,"author":{"gitId":"Zack-Tay"},"content":"7. Should be usable by a person who is TA-ing for the first time.","lastModifiedDate":"2024-03-05"},{"lineNumber":458,"author":{"gitId":"Zack-Tay"},"content":"8. Should provide comprehensive error messages and guidelines to recover from errors due to user input.","lastModifiedDate":"2024-03-05"},{"lineNumber":459,"author":{"gitId":"Zack-Tay"},"content":"9. Should provide a comprehensive and well-designed user documentation to guide users on how to use TAHelper.","lastModifiedDate":"2024-03-05"},{"lineNumber":460,"author":{"gitId":"Zack-Tay"},"content":"10. Should provide a comprehensive and well-designed developer documentation to guide developer on how to improve and develop TAHelper further.","lastModifiedDate":"2024-03-05"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"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":"Zack-Tay"},"content":"* **TA (Teaching Assistant)**: An individual who is responsible for teaching a tutorial class of University students.","lastModifiedDate":"2024-03-05"},{"lineNumber":469,"author":{"gitId":"Zack-Tay"},"content":"* **TAHelper**: A contact management application to help TAs keep track of students in classes they teach","lastModifiedDate":"2024-03-05"},{"lineNumber":470,"author":{"gitId":"Zack-Tay"},"content":"* **GUI**: Graphical User Interface","lastModifiedDate":"2024-03-05"},{"lineNumber":471,"author":{"gitId":"Zack-Tay"},"content":"* **MSS**: Main Success Scenario","lastModifiedDate":"2024-03-05"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":481,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":482,"author":{"gitId":"Jajared"},"content":"testers are expected to do more _exploratory_ testing.","lastModifiedDate":"2024-03-05"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"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":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"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":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"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":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"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":516,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"qinxutan":14,"Zack-Tay":32,"-":333,"Jajared":143,"whelan-low":4}},{"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":"Zack-Tay"},"content":"# TAHelper User Guide","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Zack-Tay"},"content":"TAHelper 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, TAHelper can get your students\u0027 contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Zack-Tay"},"content":"1. Download the latest `tahelper.jar` from [here](https://github.com/AY2324S2-CS2103T-T09-4/tp/releases).","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"Zack-Tay"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your TAHelper.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"Zack-Tay"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar tahelper.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"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":"Zack-Tay"},"content":"1. Type the command in the command box and press Enter to execute it. e.g. typing **`list_student`** and pressing Enter will display a list of students.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"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":"Zack-Tay"},"content":" - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A module/CS2103T class/T09` : Adds a new student contact with all the details that have been specified to the relevant module and tutorial class.","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Zack-Tay"},"content":" - `/delete_student id/A0259209B | /delete_student email/johndoe@gmail.com` : Deletes a student contact with email `johndoe@gmail.com` or id `A0259209B`.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Zack-Tay"},"content":" - `/search_student id/A0123456A` : Searches for a student with id `A0123456A`.","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"Zack-Tay"},"content":" - `/list_student` : View the list of all students available.","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Zack-Tay"},"content":" - `/add_class module/CS2103T class/T09` : Adds a new tutorial class `T09` under the module `2103T`.","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"Zack-Tay"},"content":" - `/delete_class module/CS2103T class/T09` : Deletes a tutorial class `T09` under the module `2103T`.","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"Zack-Tay"},"content":" - `/list_class` : List of all tutorial classes available.","lastModifiedDate":"2024-03-06"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"Zack-Tay"},"content":" e.g. in `add name/NAME`, `NAME` is a parameter which can be used as `add name/John Doe`.","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"Jajared"},"content":"- Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"Zack-Tay"},"content":" e.g `name/NAME` can be used as `name/John Doe`.","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"Zack-Tay"},"content":"- Parameters must follow the order specified in the user guide.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"Zack-Tay"},"content":" e.g. if the command specifies `name/NAME id/ID\u0027, it has to be in this format.","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"Zack-Tay"},"content":"- Extraneous parameters for commands that do not take in parameters (such as `list_student`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"Zack-Tay"},"content":" e.g. if the command specifies `list_student 123`, it will be interpreted as `list_student`.","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":67,"author":{"gitId":"Jajared"},"content":"- If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.","lastModifiedDate":"2024-03-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"Zack-Tay"},"content":"### Adding new students : `add_student`","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"Zack-Tay"},"content":"Adds a new student contact with all the details that have been specified by the user to the relevant module and tutorial class","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"Zack-Tay"},"content":"Format: `/add_student name/NAME email/EMAIL id/STUDENT_ID module/MODULE_CODE tutorial/TUTORIAL_CLASS`","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"Zack-Tay"},"content":"- The following parameters to add a student contact are supported:","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"Zack-Tay"},"content":" 1. Name","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"Zack-Tay"},"content":" 2. Email","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"Zack-Tay"},"content":" 3. Student ID","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"Zack-Tay"},"content":" 4. Module Code","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"Zack-Tay"},"content":" 5. Tutorial class","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"Zack-Tay"},"content":"- Leading/trailing spaces are removed","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"Zack-Tay"},"content":"- The parameter is case-insensitive","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"Zack-Tay"},"content":"- If none of the parameters or an invalid parameter is specified, the command will return an error message indicating that a valid parameter must be provided.","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"Zack-Tay"},"content":"- For V1.2, we will only be adding students to their respective tutorial group. Instead, what happens is that we will add all the students to the respective module headers.","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"Zack-Tay"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"Zack-Tay"},"content":"Upon a successful add, the command will return a confirmation messaging stating that the specified student contact has been added.","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"Zack-Tay"},"content":"- `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A module/CS2103T tutorial/T09`","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"Jajared"},"content":"### Deleting students : `delete_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"Jajared"},"content":"Delete a student contact based on the parameter specified by the user.","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":98,"author":{"gitId":"Jajared"},"content":"Format: `/delete_student id/STUDENT_ID email/EMAIL`","lastModifiedDate":"2024-03-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"Jajared"},"content":"- The following parameters to delete a student contact are supported:","lastModifiedDate":"2024-03-05"},{"lineNumber":101,"author":{"gitId":"Jajared"},"content":" 1. Student ID","lastModifiedDate":"2024-03-05"},{"lineNumber":102,"author":{"gitId":"Jajared"},"content":" 2. Email","lastModifiedDate":"2024-03-05"},{"lineNumber":103,"author":{"gitId":"Jajared"},"content":"- Leading/trailing spaces are removed","lastModifiedDate":"2024-03-05"},{"lineNumber":104,"author":{"gitId":"Zack-Tay"},"content":"- The parameter is case-insensitive","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"Zack-Tay"},"content":"- If none of the parameters or an invalid parameter is specified, the command will return an error message indicating that a valid parameter must be provided.","lastModifiedDate":"2024-03-06"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":107,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":108,"author":{"gitId":"Jajared"},"content":"Upon successful deletion, the command will return a confirmation messaging stating that the specified student contact has been removed.","lastModifiedDate":"2024-03-05"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-05"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":112,"author":{"gitId":"Jajared"},"content":"- Delete by student ID: `/delete_student id/A01234567X`","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"Jajared"},"content":"- Delete by email: `/delete_student email/e0123456@u.nus.edu`","lastModifiedDate":"2024-03-05"},{"lineNumber":114,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"qinxutan"},"content":"### Searching for students : `search`","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"mahadhir247"},"content":"Search for a student\u0027s contact based on specified query.","lastModifiedDate":"2024-03-06"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":119,"author":{"gitId":"mahadhir247"},"content":"Format: `/search_student [id/STUDENT_ID] [email/EMAIL] [class/TUTORIAL_CLASS] [name/NAME]`","lastModifiedDate":"2024-03-06"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":121,"author":{"gitId":"mahadhir247"},"content":"- At least one of the optional attributes must be provided.","lastModifiedDate":"2024-03-06"},{"lineNumber":122,"author":{"gitId":"mahadhir247"},"content":"- The search query is case-insensitive. e.g. `ian` will match `Ian`","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"mahadhir247"},"content":"- The search query will match information corresponding to the optional attribute. e.g. `id/` will only search for IDs","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"mahadhir247"},"content":"- Partial matches will also be displayed e.g. `@gmail` will return **ALL** emails containing `@gmail`","lastModifiedDate":"2024-03-06"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":127,"author":{"gitId":"mahadhir247"},"content":"- `/search_student id/A012345A` Returns student with corresponding id","lastModifiedDate":"2024-03-06"},{"lineNumber":128,"author":{"gitId":"mahadhir247"},"content":"- `/search_student email/@GMAIL` Returns all students who have `@gmail` in their email","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":130,"author":{"gitId":"Jajared"},"content":"### Listing all students : `list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":132,"author":{"gitId":"Jajared"},"content":"View the list of all students available","lastModifiedDate":"2024-03-05"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":134,"author":{"gitId":"Jajared"},"content":"Format: `/list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":136,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":137,"author":{"gitId":"Jajared"},"content":"The command will display the list of all students along with their student information. If there are no existing students, the command will return a message indicating that there are no students currently.","lastModifiedDate":"2024-03-05"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"whelan-low"},"content":"### Adding new tutorial class : `add_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":141,"author":{"gitId":"whelan-low"},"content":"Adds a tutorial class with the specified module code and name.","lastModifiedDate":"2024-02-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":143,"author":{"gitId":"whelan-low"},"content":"Format: `/add_class module/MODULE_CODE class/TUTORIAL_CLASS`","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":145,"author":{"gitId":"whelan-low"},"content":"- If none of the parameters is specified, or if only one is specified, returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":147,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"whelan-low"},"content":"- `/add_class module/CS2103T class/T10`","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"whelan-low"},"content":"- `/add_class module/CS2109S class/T01`","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":152,"author":{"gitId":"whelan-low"},"content":"### Deleting tutorial class : `delete_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":154,"author":{"gitId":"whelan-low"},"content":"Deletes a specified tutorial class from the list of classes.","lastModifiedDate":"2024-02-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"whelan-low"},"content":"Format: `/delete_class module/MODULE_CODE class/TUTORIAL_CLASS`","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"whelan-low"},"content":"- If the module code does not exist, it returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"whelan-low"},"content":"- If the tutorial class within that module code does not exist, it returns an error and the list of tutorial classes in that module code.","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"whelan-low"},"content":"- If no parameters are specified, returns an error","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":164,"author":{"gitId":"whelan-low"},"content":"- `/delete_class module/CS2103T class/T10`","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"whelan-low"},"content":"- `/delete_class module/CS2109S class/T01`","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":167,"author":{"gitId":"Zack-Tay"},"content":"### Listing all classes: `list_class`","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":169,"author":{"gitId":"qinxutan"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2024-02-25"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":171,"author":{"gitId":"qinxutan"},"content":"Format: `list_class`","lastModifiedDate":"2024-02-25"},{"lineNumber":172,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"Zack-Tay"},"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 TAHelper home folder.","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":183,"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":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":185,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":187,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"Jajared"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"Zack-Tay"},"content":"|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"Zack-Tay"},"content":"| **Add New Students** | `add_student name/ \u003cstudent_name\u003e email/ \u003cstudent_email\u003e id/ \u003cstudent_id\u003e module/ \u003cmodule\u003e tutorial/ \u003cclass\u003e` \u003cbr\u003e e.g., `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A module/CS2103T tutorial/T09` |","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"Zack-Tay"},"content":"| **Delete students** | `delete_student \u003cid/, email/\u003e \u003cid or email\u003e`\u003cbr\u003e e.g., `delete_student id/A0259209B` or `/delete_student email/johndoe@gmail.com` |","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"Zack-Tay"},"content":"| **Search for students** | `search_student \u003cid/, email/, tc/, name/\u003e \u003cid or email or tutorial or name\u003e`\u003cbr\u003e e.g.,`search_student id/A0123456A` |","lastModifiedDate":"2024-03-06"},{"lineNumber":194,"author":{"gitId":"Jajared"},"content":"| **View all students** | `list_student` |","lastModifiedDate":"2024-03-05"},{"lineNumber":195,"author":{"gitId":"Zack-Tay"},"content":"| **Add new tutorial class** | `add_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `add_class module/CS2103T tutorial/T09` |","lastModifiedDate":"2024-03-06"},{"lineNumber":196,"author":{"gitId":"Zack-Tay"},"content":"| **Delete tutorial class** | `delete_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `delete_class module/CS2103T tutorial/T09` |","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"Jajared"},"content":"| **View all classes** | `list_class` |","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":4,"Zack-Tay":45,"-":97,"Jajared":27,"mahadhir247":8,"whelan-low":16}}] diff --git a/AY2324S2-CS2103T-T09-4_tp_master/commits.json b/AY2324S2-CS2103T-T09-4_tp_master/commits.json index 08c44e30..d88d111e 100644 --- a/AY2324S2-CS2103T-T09-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-T09-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"qinxutan":[{"date":"2024-02-25","commitResults":[{"hash":"8cf8561c7e10bfff4fa6fc2f18d6c9dd01fb85a6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"7b8fb6cc9a5f60b76e537592ec7eb9dd9c641e06","isMergeCommit":true,"messageTitle":"Merge pull request #16 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"9ba53f8ad0bea91b3574e3021ddb93e2d9fb2831","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge updates","fileTypesAndContributionMap":{}},{"hash":"13310ca30632f59453ae7af56a79f1273d579e24","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"b5d4ef6f2d25acef07fb77067b9aa4f42ddf8e5b","isMergeCommit":true,"messageTitle":"Merge pull request #18 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"7c49fe99cc4929cae3ac8b8ad88a98ce12ea52fc","isMergeCommit":false,"messageTitle":"Edit UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":23}}},{"hash":"5953e52547f50c92a46d63d5033290df9a8a4d1e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from qinxutan/update-userguide","messageBody":"Edit UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"322ed9a1ee050961b6a2de83a47fd609d9a010b7","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":32,"deletions":19}}},{"hash":"66b392245bd82e6b4623866838c4c4de7bda58c9","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":6}}},{"hash":"47c1a3a8b831393efbd00cda9c4dd2c3fd207b7a","isMergeCommit":true,"messageTitle":"Merge pull request #20 from qinxutan/update-developerguide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8d33257b0c6979035a45cdc8d2e61c6744fd017e","isMergeCommit":true,"messageTitle":"Merge pull request #21 from qinxutan/update-userguide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"f0887f9aee1f9d42fb27c8655ba1e1e4593aa3e2","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T09-4/master","messageBody":"merge","fileTypesAndContributionMap":{}},{"hash":"f55ae2dd8279bb7ed9b18d5116bd694b87a2e2af","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Jajared/jared/update-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14b76a0aef7cded69a32b4c11a9039eba0cdb6d7","isMergeCommit":true,"messageTitle":"Merge pull request #3 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge","fileTypesAndContributionMap":{}},{"hash":"d2dc77c45f9d0017b974509201e34a98761715e5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-ug-view-students","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a29fd7a4a309efd94b08a3c4381f87a8bef16348","isMergeCommit":true,"messageTitle":"Merge pull request #35 from Jajared/jared/update-ug-view-students","messageBody":"Update user guide for view students and delete student","fileTypesAndContributionMap":{}},{"hash":"47c27cc8483bcd310fe4f924318d9feda18afd76","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"725f019bb0766e132855c54f7db5bc594f465392","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-userguide","messageBody":"","fileTypesAndContributionMap":{}}]}],"Zack-Tay":[{"date":"2024-02-28","commitResults":[{"hash":"124e22b073232d9f0175858f6f45acc08554b81a","isMergeCommit":false,"messageTitle":"Update AboutUs.md and Add profile image (#22)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"80ed63422879aa59e7c881c7571644b9d1bca339","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md define use cases (#29)","messageBody":"* Define use cases 1 to 4 of TAHelper.\r\n* Add extensions to handle exception cases.","fileTypesAndContributionMap":{"docs":{"insertions":79,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"130dc070adaff01de9751263860d1f5a8c3759a2","isMergeCommit":true,"messageTitle":"Merge pull request #36 from qinxutan/update-userguide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"79f9ea1582e2978dcf7046b75c30232524c16f66","isMergeCommit":false,"messageTitle":"Update Glossary and NFR in DeveloperGuide.md (#38)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":19}}},{"hash":"0e6ea15cb7625ebd488f75efe48860533ca2a66b","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Jajared/jared/update-dg-use-cases","messageBody":"Update use cases in developers guide","fileTypesAndContributionMap":{}}]}],"Jajared":[{"date":"2024-02-25","commitResults":[{"hash":"7b58c9a89dddf1ab0b9c028c86724e4fde40f9c1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"9df8ccacfe7bef4b106a55d0386fcdfc4b74805e","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":10}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2c481ab2424fbce6d8aa94e6971600dced4758bc","isMergeCommit":false,"messageTitle":"refactor: Update user image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":13}}},{"hash":"0e57535769744904ec281aef2e61fca0ff87f9a8","isMergeCommit":false,"messageTitle":"docs: Update ug for view students and delete student","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":54}}},{"hash":"f0ba81f55907ab163736d13709c05e038e8cbbdf","isMergeCommit":false,"messageTitle":"docs: Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":160,"deletions":148}}},{"hash":"4de84173a251707c6d7e179f8282d808db565cfb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-dg-use-cases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0525f4d849bb83c1ae2232fd5d8bcaf479d48b9e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-dg-use-cases","messageBody":"","fileTypesAndContributionMap":{}}]}],"mahadhir247":[{"date":"2024-02-28","commitResults":[{"hash":"724c28bc143ea9be0650fb3ca3c36a0aeb076a3c","isMergeCommit":false,"messageTitle":"Add profile picture and Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"e1e643722b1c58bbf1b2226aca7c2f09ae64b12f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from mahadhir247/master","messageBody":"Add profile picture and Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"whelan-low":[{"date":"2024-02-25","commitResults":[{"hash":"8ef80750b53c2f5bc5b75948023b8b9dea6d3bb2","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"758d9336292f5f444d18c572fda28b62cc1396d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c59bb41cc1b3aa6fbb17955a02e8312b6c9ffb3a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c77d366cb59bb562cb3137a30dd231a1d92be3af","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"c67b3a97551c9b4a118d76e38cd25a515ddb9a6a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"66220294ee0622a4d6b9257e20682ab23a58500d","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}}]},{"date":"2024-02-29","commitResults":[{"hash":"3f01b06e9f785754de7d4ed7805e1159a883c4ef","isMergeCommit":false,"messageTitle":"Added user guide section for add and delete classes (#25)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":2}}},{"hash":"b783a968501fdb14e2b65105b639747afb0c2a54","isMergeCommit":false,"messageTitle":"Update Use cases for developer guide (#24)","messageBody":"Co-authored-by: Jajabonks \u003c84561814+Jajared@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":0}}}]}]},"authorFileTypeContributionMap":{"qinxutan":{"docs":34,"functional-code":0,"test-code":0},"Zack-Tay":{"docs":33,"functional-code":0,"test-code":0},"Jajared":{"docs":283,"functional-code":0,"test-code":0},"mahadhir247":{"docs":2,"functional-code":0,"test-code":0},"whelan-low":{"docs":29,"functional-code":0,"test-code":0}},"authorContributionVariance":{"qinxutan":1109.2427,"Zack-Tay":635.1875,"Jajared":16996.908,"mahadhir247":1.2222221,"whelan-low":192.07635},"authorDisplayNameMap":{"qinxutan":"CS2103T-T09-4 TAN ..N XU","Zack-Tay":"CS2103T-T09-4 TAY .. KAI","Jajared":"CS2103T-T09-4 JARE.. JIE","mahadhir247":"CS2103T-T09-4 MAHA..MAIL","whelan-low":"CS2103T-T09-4 LOW ..ELAN"}} +{"authorDailyContributionsMap":{"qinxutan":[{"date":"2024-02-25","commitResults":[{"hash":"8cf8561c7e10bfff4fa6fc2f18d6c9dd01fb85a6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"7b8fb6cc9a5f60b76e537592ec7eb9dd9c641e06","isMergeCommit":true,"messageTitle":"Merge pull request #16 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"9ba53f8ad0bea91b3574e3021ddb93e2d9fb2831","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge updates","fileTypesAndContributionMap":{}},{"hash":"13310ca30632f59453ae7af56a79f1273d579e24","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"b5d4ef6f2d25acef07fb77067b9aa4f42ddf8e5b","isMergeCommit":true,"messageTitle":"Merge pull request #18 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"7c49fe99cc4929cae3ac8b8ad88a98ce12ea52fc","isMergeCommit":false,"messageTitle":"Edit UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":23}}},{"hash":"5953e52547f50c92a46d63d5033290df9a8a4d1e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from qinxutan/update-userguide","messageBody":"Edit UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"322ed9a1ee050961b6a2de83a47fd609d9a010b7","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":32,"deletions":19}}},{"hash":"66b392245bd82e6b4623866838c4c4de7bda58c9","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":6}}},{"hash":"47c1a3a8b831393efbd00cda9c4dd2c3fd207b7a","isMergeCommit":true,"messageTitle":"Merge pull request #20 from qinxutan/update-developerguide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8d33257b0c6979035a45cdc8d2e61c6744fd017e","isMergeCommit":true,"messageTitle":"Merge pull request #21 from qinxutan/update-userguide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"f0887f9aee1f9d42fb27c8655ba1e1e4593aa3e2","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T09-4/master","messageBody":"merge","fileTypesAndContributionMap":{}},{"hash":"f55ae2dd8279bb7ed9b18d5116bd694b87a2e2af","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Jajared/jared/update-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14b76a0aef7cded69a32b4c11a9039eba0cdb6d7","isMergeCommit":true,"messageTitle":"Merge pull request #3 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge","fileTypesAndContributionMap":{}},{"hash":"d2dc77c45f9d0017b974509201e34a98761715e5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-ug-view-students","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a29fd7a4a309efd94b08a3c4381f87a8bef16348","isMergeCommit":true,"messageTitle":"Merge pull request #35 from Jajared/jared/update-ug-view-students","messageBody":"Update user guide for view students and delete student","fileTypesAndContributionMap":{}},{"hash":"47c27cc8483bcd310fe4f924318d9feda18afd76","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"725f019bb0766e132855c54f7db5bc594f465392","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-userguide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"c103820efa6e7755e7181811f51c6c416457d156","isMergeCommit":true,"messageTitle":"Merge pull request #42 from whelan-low/update_UG_2","messageBody":"Update User Guide add student and delete student command","fileTypesAndContributionMap":{}},{"hash":"4fda5c83067e66585325cf29e62d5dcc41d411dd","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into user-guide-search-student","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d61f9423525b1d9c8cc3ff053c2d8f083efc259f","isMergeCommit":true,"messageTitle":"Merge pull request #41 from mahadhir247/user-guide-search-student","messageBody":"Update UserGuide.md to include Search Student","fileTypesAndContributionMap":{}},{"hash":"289d018b21f082c6c61135d75839447a43d3a484","isMergeCommit":true,"messageTitle":"Merge pull request #45 from Zack-Tay/master","messageBody":"Update UserGuide Commands","fileTypesAndContributionMap":{}},{"hash":"a98ece3d13fb3198c2818e6ca4bc976fd36fbb01","isMergeCommit":true,"messageTitle":"Merge pull request #46 from Zack-Tay/master","messageBody":"Update User Guide remove AB3 docs","fileTypesAndContributionMap":{}}]}],"Zack-Tay":[{"date":"2024-02-28","commitResults":[{"hash":"124e22b073232d9f0175858f6f45acc08554b81a","isMergeCommit":false,"messageTitle":"Update AboutUs.md and Add profile image (#22)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"80ed63422879aa59e7c881c7571644b9d1bca339","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md define use cases (#29)","messageBody":"* Define use cases 1 to 4 of TAHelper.\r\n* Add extensions to handle exception cases.","fileTypesAndContributionMap":{"docs":{"insertions":79,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"130dc070adaff01de9751263860d1f5a8c3759a2","isMergeCommit":true,"messageTitle":"Merge pull request #36 from qinxutan/update-userguide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"79f9ea1582e2978dcf7046b75c30232524c16f66","isMergeCommit":false,"messageTitle":"Update Glossary and NFR in DeveloperGuide.md (#38)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":19}}},{"hash":"0e6ea15cb7625ebd488f75efe48860533ca2a66b","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Jajared/jared/update-dg-use-cases","messageBody":"Update use cases in developers guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"0e5bc08dd21a5d36941ae959f0300e22be03fc0a","isMergeCommit":false,"messageTitle":"Update UserGuide Commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":31}}},{"hash":"858d4225d35ee27577e46e6aec74d73e1dfa1380","isMergeCommit":false,"messageTitle":"Update User Guide remove AB3 docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":101}}}]}],"Jajared":[{"date":"2024-02-25","commitResults":[{"hash":"7b58c9a89dddf1ab0b9c028c86724e4fde40f9c1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"9df8ccacfe7bef4b106a55d0386fcdfc4b74805e","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":10}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2c481ab2424fbce6d8aa94e6971600dced4758bc","isMergeCommit":false,"messageTitle":"refactor: Update user image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":13}}},{"hash":"0e57535769744904ec281aef2e61fca0ff87f9a8","isMergeCommit":false,"messageTitle":"docs: Update ug for view students and delete student","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":54}}},{"hash":"f0ba81f55907ab163736d13709c05e038e8cbbdf","isMergeCommit":false,"messageTitle":"docs: Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":160,"deletions":148}}},{"hash":"4de84173a251707c6d7e179f8282d808db565cfb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-dg-use-cases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0525f4d849bb83c1ae2232fd5d8bcaf479d48b9e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-dg-use-cases","messageBody":"","fileTypesAndContributionMap":{}}]}],"mahadhir247":[{"date":"2024-02-28","commitResults":[{"hash":"724c28bc143ea9be0650fb3ca3c36a0aeb076a3c","isMergeCommit":false,"messageTitle":"Add profile picture and Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"e1e643722b1c58bbf1b2226aca7c2f09ae64b12f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from mahadhir247/master","messageBody":"Add profile picture and Update AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"fe9a334f7e355542af07a287dd545ae489c71a4c","isMergeCommit":false,"messageTitle":"Update UserGuide.md to include Search Student","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":0}}},{"hash":"dbad9e25123fc856f454ef533ebcc0346d26ffd6","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into user-guide-search-student","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1dc8206eefda452c9c24e527250da8467c936f02","isMergeCommit":false,"messageTitle":"Update UserGuide.md command format for Search","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"77b5df791318f622b9108be16acecfc56b31b766","isMergeCommit":false,"messageTitle":"Change command format for tutorial attribute","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"whelan-low":[{"date":"2024-02-25","commitResults":[{"hash":"8ef80750b53c2f5bc5b75948023b8b9dea6d3bb2","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"758d9336292f5f444d18c572fda28b62cc1396d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c59bb41cc1b3aa6fbb17955a02e8312b6c9ffb3a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c77d366cb59bb562cb3137a30dd231a1d92be3af","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"c67b3a97551c9b4a118d76e38cd25a515ddb9a6a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"66220294ee0622a4d6b9257e20682ab23a58500d","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}}]},{"date":"2024-02-29","commitResults":[{"hash":"3f01b06e9f785754de7d4ed7805e1159a883c4ef","isMergeCommit":false,"messageTitle":"Added user guide section for add and delete classes (#25)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":2}}},{"hash":"b783a968501fdb14e2b65105b639747afb0c2a54","isMergeCommit":false,"messageTitle":"Update Use cases for developer guide (#24)","messageBody":"Co-authored-by: Jajabonks \u003c84561814+Jajared@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":0}}}]},{"date":"2024-03-06","commitResults":[{"hash":"60a3a1e0579fbf92b8bcdf8128756c5017e9ebb1","isMergeCommit":false,"messageTitle":"Update User Guide add student and delete student command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}]},"authorFileTypeContributionMap":{"qinxutan":{"docs":19,"functional-code":0,"test-code":0},"Zack-Tay":{"docs":78,"functional-code":0,"test-code":0},"Jajared":{"docs":230,"functional-code":0,"test-code":0},"mahadhir247":{"docs":10,"functional-code":0,"test-code":0},"whelan-low":{"docs":22,"functional-code":0,"test-code":0}},"authorContributionVariance":{"qinxutan":1032.6393,"Zack-Tay":2829.7632,"Jajared":15833.775,"mahadhir247":37.609467,"whelan-low":179.78697},"authorDisplayNameMap":{"qinxutan":"CS2103T-T09-4 TAN ..N XU","Zack-Tay":"CS2103T-T09-4 TAY .. KAI","Jajared":"CS2103T-T09-4 JARE.. JIE","mahadhir247":"CS2103T-T09-4 MAHA..MAIL","whelan-low":"CS2103T-T09-4 LOW ..ELAN"}} diff --git a/AY2324S2-CS2103T-T10-1_tp_master/authorship.json b/AY2324S2-CS2103T-T10-1_tp_master/authorship.json index cc06029c..0766bfd6 100644 --- a/AY2324S2-CS2103T-T10-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T10-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"delishad21"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T10-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-1/tp/actions)","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"delishad21"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-1/tp/graph/badge.svg?token\u003d6NGZ4VS4VC)](https://app.codecov.io/gh/AY2324S2-CS2103T-T10-1/tp)","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"delishad21"},"content":"## Avengers Assemble","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"delishad21"},"content":"Avengers Assemble is a contact management app, meant for use with a Command Line Interface (CLI) while still maintaining the benefits of a Graphical User Interface (GUI).","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"delishad21"},"content":"The application is designed for Head Tutors of the CS1101S Programming Methodology course but its use cases can be extended to Head Tutors of other courses.","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"delishad21"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"delishad21"},"content":"### Project Links","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"delishad21"},"content":"[Project Website](https://ay2324s2-cs2103t-t10-1.github.io/tp/)","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"delishad21"},"content":"[User Guide](https://ay2324s2-cs2103t-t10-1.github.io/tp/UserGuide.html)","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"delishad21"},"content":"[Developer Guide](https://ay2324s2-cs2103t-t10-1.github.io/tp/DeveloperGuide.html)","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"delishad21"},"content":"[About Us](https://ay2324s2-cs2103t-t10-1.github.io/tp/AboutUs.html)","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"delishad21":16}},{"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":"jayllo-c"},"content":"### Johan Soo","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"delishad21"},"content":"\u003cimg src\u003d\"images/delishad21.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"delishad21"},"content":"[[github](https://github.com/delishad21)]","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"delishad21"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"delishad21"},"content":"* Responsibilities: Develop Code","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jayllo-c"},"content":"### Ang Leng Khai","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Zer0Legion"},"content":"\u003cimg src\u003d\"images/zer0legion.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Zer0Legion"},"content":"[[github](http://github.com/zer0legion)] ","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"Zer0Legion"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"Zer0Legion"},"content":"* Responsibilities: Develop code","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"danielleloh"},"content":"### Loh Sze Han, Danielle","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"danielleloh"},"content":"\u003cimg src\u003d\"images/danielleloh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"danielleloh"},"content":"[[github](http://github.com/danielleloh)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":39,"author":{"gitId":"danielleloh"},"content":"* Responsibilities: Develop code","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"jayllo-c"},"content":"### Pughal Raj","lastModifiedDate":"2024-02-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"Pughal77"},"content":"\u003cimg src\u003d\"images/pughal77.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Pughal77"},"content":"[[github](http://github.com/Pughal77)]","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"Pughal77"},"content":"* Responsibilities: Develop code","lastModifiedDate":"2024-02-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"jayllo-c"},"content":"### Castillo James","lastModifiedDate":"2024-02-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"jayllo-c"},"content":"\u003cimg src\u003d\"images/jayllo-c.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"jayllo-c"},"content":"[[github](http://github.com/jayllo-c)]","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"jayllo-c"},"content":"* Responsibilities: Develop Code","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"danielleloh":4,"delishad21":4,"Pughal77":3,"Zer0Legion":4,"jayllo-c":7,"-":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":"Zer0Legion"},"content":"# Avengers Assemble Developer Guide","lastModifiedDate":"2024-02-27"},{"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":"Zer0Legion"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-27"},{"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":"Zer0Legion"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.)","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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-03-03"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-03-03"},{"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":"2024-03-03"},{"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":"2024-03-03"},{"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":"delishad21"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2024-03-03"},{"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":"Zer0Legion"},"content":"* Name: Sarah Johnson","lastModifiedDate":"2024-02-27"},{"lineNumber":278,"author":{"gitId":"Zer0Legion"},"content":"* Age: 23","lastModifiedDate":"2024-02-27"},{"lineNumber":279,"author":{"gitId":"Zer0Legion"},"content":"* Occupation: Head Tutor for CS1101S","lastModifiedDate":"2024-02-27"},{"lineNumber":280,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":281,"author":{"gitId":"Zer0Legion"},"content":"* head tutor for CS1101S course","lastModifiedDate":"2024-02-27"},{"lineNumber":282,"author":{"gitId":"Zer0Legion"},"content":"* has a need to manage various aspects of course administration","lastModifiedDate":"2024-02-27"},{"lineNumber":283,"author":{"gitId":"Zer0Legion"},"content":"* has a need to schedule classes","lastModifiedDate":"2024-02-27"},{"lineNumber":284,"author":{"gitId":"Zer0Legion"},"content":"* has a need to coordinate with teaching assistants","lastModifiedDate":"2024-02-27"},{"lineNumber":285,"author":{"gitId":"Zer0Legion"},"content":"* has a need to effectively communicate with students","lastModifiedDate":"2024-02-27"},{"lineNumber":286,"author":{"gitId":"delishad21"},"content":"* has a need to manage a significant number of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":287,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":290,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"Zer0Legion"},"content":"**Value proposition**:","lastModifiedDate":"2024-02-27"},{"lineNumber":293,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":294,"author":{"gitId":"delishad21"},"content":"* manage persons faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-03"},{"lineNumber":295,"author":{"gitId":"delishad21"},"content":"* Centralised platform to store and manage person details for all relevant individuals involved in course administration","lastModifiedDate":"2024-03-03"},{"lineNumber":296,"author":{"gitId":"delishad21"},"content":"* Easier access to information through organising relevant persons into different subgroups","lastModifiedDate":"2024-03-03"},{"lineNumber":297,"author":{"gitId":"Zer0Legion"},"content":"* Direct linkages to students’ schoolwork for easier tracking","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"Zer0Legion"},"content":"* Able to set up the address book through different data-loading options","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"Zer0Legion"},"content":"* Able to assist with management of large scale communication","lastModifiedDate":"2024-02-27"},{"lineNumber":300,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":301,"author":{"gitId":"Zer0Legion"},"content":"**Problem Scope**:","lastModifiedDate":"2024-02-27"},{"lineNumber":302,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":303,"author":{"gitId":"Zer0Legion"},"content":"* The CS1101S Head Tutor will face challenges in effectively organising and managing contact information within the department due to the large scale the course has to operate on. Existing methods, such as paper-based lists or basic digital spreadsheets, lack the necessary functionality to efficiently handle the diverse needs of proper contact management. There is a need for a user-friendly and offline-capable address book solution tailored specifically to the needs of a single user. This address book system should provide features such as easy contact entry and editing, quick search functionality, customizable categorization options, and the ability to add notes for each contact. Additionally, it should operate offline without requiring an internet connection and should not rely on complex database management systems.","lastModifiedDate":"2024-02-27"},{"lineNumber":304,"author":{"gitId":"Zer0Legion"},"content":"* While the address book system will greatly improve contact management and organisation for the CS1101S Head Tutor, it will not address broader departmental communication or collaboration needs beyond individual contact management since the address book is designed to be a single-user system. It will not facilitate communication between users or provide collaboration tools for group projects or tasks. Additionally, the address book system will not handle complex data analysis or reporting functions beyond basic contact information management. Finally, while the system will provide offline functionality, it will not offer real-time synchronisation with online databases or cloud storage solutions.","lastModifiedDate":"2024-02-27"},{"lineNumber":305,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"Zer0Legion"},"content":"|----------|---------------------------------------------|----------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | potential user exploring the app | see the app populated with sample data | immediately see an example of the app in use |","lastModifiedDate":"2024-02-27"},{"lineNumber":315,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | new user | easily clear the example data | start using the app with real-life data |","lastModifiedDate":"2024-02-27"},{"lineNumber":316,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"delishad21"},"content":"| `* * *` | new user | add persons with their details | start populating the address book |","lastModifiedDate":"2024-03-03"},{"lineNumber":318,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | new user | save the data I input into the app | don\u0027t lose the information I\u0027ve entered |","lastModifiedDate":"2024-02-27"},{"lineNumber":319,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2024-03-03"},{"lineNumber":320,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2024-03-03"},{"lineNumber":321,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | update and edit person details | keep my address book accurate |","lastModifiedDate":"2024-03-03"},{"lineNumber":322,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":323,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":324,"author":{"gitId":"delishad21"},"content":"| `* * *` | head tutor using the app | categorise my persons into groups | manage different tutorial groups effectively |","lastModifiedDate":"2024-03-03"},{"lineNumber":325,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | head tutor using the app | copy email addresses of a group | effectively communicate with target groups |","lastModifiedDate":"2024-02-27"},{"lineNumber":326,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":327,"author":{"gitId":"delishad21"},"content":"| `* *` | user | hide private person details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2024-03-03"},{"lineNumber":328,"author":{"gitId":"Zer0Legion"},"content":"| `* *` | experienced user | use the address book offline | update and interact with it anywhere |","lastModifiedDate":"2024-02-27"},{"lineNumber":329,"author":{"gitId":"delishad21"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2024-03-03"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"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":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"delishad21"},"content":"**Use case: UC01 — Delete a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"delishad21"},"content":"1. User !!requests to list persons (UC04)!!","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-03"},{"lineNumber":344,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2024-03-03"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"danielleloh"},"content":"**Use case: UC02 — Help**","lastModifiedDate":"2024-02-29"},{"lineNumber":361,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":362,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":363,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":364,"author":{"gitId":"Zer0Legion"},"content":"1. User requests help information.","lastModifiedDate":"2024-02-27"},{"lineNumber":365,"author":{"gitId":"Zer0Legion"},"content":"2. AddressBook displays help information.","lastModifiedDate":"2024-02-27"},{"lineNumber":366,"author":{"gitId":"Zer0Legion"},"content":"3. User reads the help information.","lastModifiedDate":"2024-02-27"},{"lineNumber":367,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":368,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":369,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":370,"author":{"gitId":"delishad21"},"content":"**Use case: UC03 — Add a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":372,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":373,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":374,"author":{"gitId":"delishad21"},"content":"1. User requests to add a new person and inputs details for the new person.","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"delishad21"},"content":"2. AddressBook saves the new person\u0027s information.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"delishad21"},"content":"3. AddressBook confirms the addition of the new person.","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":378,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":379,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":380,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":381,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":382,"author":{"gitId":"delishad21"},"content":"* 1a. User does not input all compulsory parameters along with the person.","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":384,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook prompts the user on the proper usage of the command.","lastModifiedDate":"2024-02-27"},{"lineNumber":385,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":386,"author":{"gitId":"Zer0Legion"},"content":" Step 1a1 is repeated until the data entered is correct.","lastModifiedDate":"2024-02-27"},{"lineNumber":387,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":388,"author":{"gitId":"delishad21"},"content":"* 1b. User tries to add a person with an existing email address.","lastModifiedDate":"2024-03-03"},{"lineNumber":389,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":390,"author":{"gitId":"danielleloh"},"content":" * 1b1. AddressBook displays and error message informing the user that the email address already exists.","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"danielleloh"},"content":" Step 1b1 is repeated until a valid email address if entered.","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"delishad21"},"content":"**Use case: UC04 — List all persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":395,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":396,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":397,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":398,"author":{"gitId":"delishad21"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":399,"author":{"gitId":"delishad21"},"content":"2. AddressBook shows the list of persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":400,"author":{"gitId":"delishad21"},"content":"3. User views the list of persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":401,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":402,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":403,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":404,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":405,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":406,"author":{"gitId":"Zer0Legion"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":407,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":408,"author":{"gitId":"Zer0Legion"},"content":" * 2a1. AddressBook displays a message indicating that the list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":409,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":410,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":411,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":412,"author":{"gitId":"delishad21"},"content":"**Use case: UC05 — Edit a person\u0027s details**","lastModifiedDate":"2024-03-03"},{"lineNumber":413,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":414,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":415,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":416,"author":{"gitId":"delishad21"},"content":"1. User requests to edit a specific person with updated details.","lastModifiedDate":"2024-03-03"},{"lineNumber":417,"author":{"gitId":"Zer0Legion"},"content":"2. AddressBook saves the updated details.","lastModifiedDate":"2024-02-27"},{"lineNumber":418,"author":{"gitId":"Zer0Legion"},"content":"3. AddressBook confirms the successful update.","lastModifiedDate":"2024-02-27"},{"lineNumber":419,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":420,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":421,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":422,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":423,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":424,"author":{"gitId":"delishad21"},"content":"* 1a. User does not input enough parameters along with the person.","lastModifiedDate":"2024-03-03"},{"lineNumber":425,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":426,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook prompts the user on the proper usage of the command.","lastModifiedDate":"2024-02-27"},{"lineNumber":427,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":428,"author":{"gitId":"Zer0Legion"},"content":" Step 1a1 is repeated until the data entered is correct.","lastModifiedDate":"2024-02-27"},{"lineNumber":429,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":430,"author":{"gitId":"delishad21"},"content":"* 1b. The selected person does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":431,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":432,"author":{"gitId":"delishad21"},"content":" * 1b1. AddressBook displays an error message indicating that the person does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":433,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":434,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":435,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":436,"author":{"gitId":"delishad21"},"content":"**Use case: UC06 — Find persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":437,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":438,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":439,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":440,"author":{"gitId":"delishad21"},"content":"1. User requests to find a specific person matching the search criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":441,"author":{"gitId":"delishad21"},"content":"2. AddressBook displays a list of persons matching the criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":442,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":443,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":444,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":445,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":446,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":447,"author":{"gitId":"delishad21"},"content":"* 1a. No persons match the search criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":448,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":449,"author":{"gitId":"delishad21"},"content":" * 1a1. AddressBook displays a message indicating that no persons match the criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":450,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":451,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":452,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":453,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":454,"author":{"gitId":"delishad21"},"content":"**Use case: UC07 — Import persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":455,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":456,"author":{"gitId":"Pughal77"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":457,"author":{"gitId":"delishad21"},"content":"1. User requests to import persons from a csv file.","lastModifiedDate":"2024-03-03"},{"lineNumber":458,"author":{"gitId":"delishad21"},"content":"2. AddressBook displays a message that all persons have been imported.","lastModifiedDate":"2024-03-03"},{"lineNumber":459,"author":{"gitId":"delishad21"},"content":"3. User is able to see all the persons imported when a list of persons is requested.","lastModifiedDate":"2024-03-03"},{"lineNumber":460,"author":{"gitId":"danielleloh"},"content":" Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":461,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":462,"author":{"gitId":"Pughal77"},"content":"**Extension**","lastModifiedDate":"2024-02-29"},{"lineNumber":463,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":464,"author":{"gitId":"danielleloh"},"content":"* 1a. AddressBook cannot find file to be imported.","lastModifiedDate":"2024-03-01"},{"lineNumber":465,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":466,"author":{"gitId":"danielleloh"},"content":" * 1a1. AddressBook displays a message indicating that the file is not recognised.","lastModifiedDate":"2024-03-01"},{"lineNumber":467,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":468,"author":{"gitId":"Pughal77"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":469,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":470,"author":{"gitId":"danielleloh"},"content":"* 1b. The file to be imported is not a csv file.","lastModifiedDate":"2024-03-01"},{"lineNumber":471,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":472,"author":{"gitId":"Pughal77"},"content":" * 1b1. AddressBook displays an error message indicating that the file type is not recognised and should be a csv file","lastModifiedDate":"2024-02-29"},{"lineNumber":473,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":474,"author":{"gitId":"Pughal77"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":475,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":476,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":477,"author":{"gitId":"danielleloh"},"content":"**Use case: UC08 — Copy email addresses**","lastModifiedDate":"2024-03-01"},{"lineNumber":478,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":479,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-03-01"},{"lineNumber":480,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":481,"author":{"gitId":"delishad21"},"content":"1. User requests to copy emails of currently displayed persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":482,"author":{"gitId":"delishad21"},"content":"2. AddressBook copies the emails of currently displayed persons","lastModifiedDate":"2024-03-03"},{"lineNumber":483,"author":{"gitId":"jayllo-c"},"content":"into user\u0027s clipboard.","lastModifiedDate":"2024-02-28"},{"lineNumber":484,"author":{"gitId":"jayllo-c"},"content":"3. AddressBook notifies the user that emails have been copied.","lastModifiedDate":"2024-02-28"},{"lineNumber":485,"author":{"gitId":"jayllo-c"},"content":"4. User can paste emails when composing emails.","lastModifiedDate":"2024-02-28"},{"lineNumber":486,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":487,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":488,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":489,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-03-01"},{"lineNumber":490,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":491,"author":{"gitId":"delishad21"},"content":"* 2a. No persons currently displayed.","lastModifiedDate":"2024-03-03"},{"lineNumber":492,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":493,"author":{"gitId":"jayllo-c"},"content":" * 2a1. AddressBook displays a message indicating that","lastModifiedDate":"2024-02-28"},{"lineNumber":494,"author":{"gitId":"delishad21"},"content":" no persons are currently displayed.","lastModifiedDate":"2024-03-03"},{"lineNumber":495,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":496,"author":{"gitId":"jayllo-c"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":497,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":498,"author":{"gitId":"delishad21"},"content":"**Use case: UC09 — Clear all persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":499,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":500,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":501,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":502,"author":{"gitId":"delishad21"},"content":"1. User requests to clear all persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":503,"author":{"gitId":"delishad21"},"content":"2. AddressBook clears all persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":504,"author":{"gitId":"delishad21"},"content":"3. AddressBook displays a message indicating that all persons have been cleared.","lastModifiedDate":"2024-03-03"},{"lineNumber":505,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":506,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":507,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":508,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":509,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":510,"author":{"gitId":"Zer0Legion"},"content":"* 1a. User inputs extraneous parameters.","lastModifiedDate":"2024-02-27"},{"lineNumber":511,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":512,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook displays a message indicating that an extraneous parameter was found, and confirms User\u0027s intention.","lastModifiedDate":"2024-02-27"},{"lineNumber":513,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":514,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":515,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":516,"author":{"gitId":"delishad21"},"content":"**Use case: UC10 — Export persons to CSV**","lastModifiedDate":"2024-03-03"},{"lineNumber":517,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":518,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":519,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":520,"author":{"gitId":"delishad21"},"content":"1. User requests to export all persons and details to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":521,"author":{"gitId":"delishad21"},"content":"2. AddressBook exports the persons to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":522,"author":{"gitId":"delishad21"},"content":"3. AddressBook displays a message to confirm that all persons have been exported to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":523,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":524,"author":{"gitId":"danielleloh"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":525,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":526,"author":{"gitId":"danielleloh"},"content":"**Use case: UC11 — Exit application**","lastModifiedDate":"2024-03-01"},{"lineNumber":527,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":528,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":529,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":530,"author":{"gitId":"Zer0Legion"},"content":"1. User requests to exit the application.","lastModifiedDate":"2024-02-27"},{"lineNumber":531,"author":{"gitId":"Zer0Legion"},"content":"2. AddressBook exits the application.","lastModifiedDate":"2024-02-27"},{"lineNumber":532,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":533,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":534,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":535,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":536,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":537,"author":{"gitId":"Zer0Legion"},"content":"* 1a. User inputs extraneous parameters.","lastModifiedDate":"2024-02-27"},{"lineNumber":538,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":539,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook displays a message indicating that an extraneous parameter was found, and confirms User\u0027s intention.","lastModifiedDate":"2024-02-27"},{"lineNumber":540,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":541,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"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":546,"author":{"gitId":"delishad21"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":547,"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":548,"author":{"gitId":"delishad21"},"content":"4. A user should be able to import up to 1000 persons from an external source without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":549,"author":{"gitId":"Zer0Legion"},"content":"5. The application should provide comprehensive documentation and help resources to assist users in understanding how to use the software effectively.","lastModifiedDate":"2024-02-27"},{"lineNumber":550,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":551,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":557,"author":{"gitId":"delishad21"},"content":"* **Private person detail**: A person detail that is not meant to be shared with others","lastModifiedDate":"2024-03-03"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":566,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":567,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":568,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":571,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":578,"author":{"gitId":"delishad21"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample persons. The window size may not be optimum.","lastModifiedDate":"2024-03-03"},{"lineNumber":579,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":580,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":581,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":582,"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":583,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":584,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":585,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":586,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":587,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2024-03-03"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2024-03-03"},{"lineNumber":592,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"delishad21"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2024-03-03"},{"lineNumber":594,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":595,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":596,"author":{"gitId":"delishad21"},"content":" Expected: First person is deleted from the list. Details of the deleted person shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-03"},{"lineNumber":597,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":598,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"delishad21"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2024-03-03"},{"lineNumber":600,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":601,"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":602,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":605,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":606,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":610,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"danielleloh":34,"delishad21":60,"Pughal77":14,"Zer0Legion":123,"jayllo-c":8,"-":373}},{"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":"delishad21"},"content":" * `list` : Lists all persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"delishad21"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 m/A1234567Z` : Adds a person named `John Doe` to the Address Book.","lastModifiedDate":"2024-03-03"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"delishad21"},"content":" * `delete 3` : Deletes the 3rd person shown in the current list.","lastModifiedDate":"2024-03-03"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"delishad21"},"content":" * `clear` : Deletes all persons.","lastModifiedDate":"2024-03-03"},{"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":"delishad21"},"content":"* Some commands require you to include parameters. These parameters are identified by prefixes.","lastModifiedDate":"2024-03-03"},{"lineNumber":52,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":53,"author":{"gitId":"delishad21"},"content":"* Here are a list of valid prefixes and what they each refer to.","lastModifiedDate":"2024-03-03"},{"lineNumber":54,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":55,"author":{"gitId":"delishad21"},"content":"| Prefix | What it refers to |","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"delishad21"},"content":"|--------|---------------------------|","lastModifiedDate":"2024-03-03"},{"lineNumber":57,"author":{"gitId":"delishad21"},"content":"|n/ | Name of the person |","lastModifiedDate":"2024-03-03"},{"lineNumber":58,"author":{"gitId":"delishad21"},"content":"|p/ | Phone number of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":59,"author":{"gitId":"delishad21"},"content":"|e/ | Email of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":60,"author":{"gitId":"delishad21"},"content":"|a/ | Address of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":61,"author":{"gitId":"delishad21"},"content":"|t/ | Tags of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":62,"author":{"gitId":"delishad21"},"content":"|m/ | Matriculation ID of person|","lastModifiedDate":"2024-03-03"},{"lineNumber":63,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"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":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"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":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"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":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"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":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"Pughal77"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will **not** be ignored.\u003cbr\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":77,"author":{"gitId":"Pughal77"},"content":" e.g. if the command specifies `help 123`, it will no longer be interpreted as `help` instead an error will be thrown.","lastModifiedDate":"2024-02-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":79,"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":80,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":92,"author":{"gitId":"Pughal77"},"content":"### Parameters:","lastModifiedDate":"2024-02-27"},{"lineNumber":93,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":94,"author":{"gitId":"Zer0Legion"},"content":"* n/NAME","lastModifiedDate":"2024-02-27"},{"lineNumber":95,"author":{"gitId":"Zer0Legion"},"content":"* p/PHONE_NUMBER","lastModifiedDate":"2024-02-27"},{"lineNumber":96,"author":{"gitId":"Zer0Legion"},"content":"* e/EMAIL","lastModifiedDate":"2024-02-27"},{"lineNumber":97,"author":{"gitId":"Zer0Legion"},"content":"* a/ADDRESS","lastModifiedDate":"2024-02-27"},{"lineNumber":98,"author":{"gitId":"Zer0Legion"},"content":"* t/TAG (Optional)","lastModifiedDate":"2024-02-27"},{"lineNumber":99,"author":{"gitId":"Zer0Legion"},"content":"* m/MATRICULATION_NUMBER (Optional)","lastModifiedDate":"2024-02-27"},{"lineNumber":100,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2024-03-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":106,"author":{"gitId":"Zer0Legion"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG] [m/MATRICULATION_NUMBER]…​`","lastModifiedDate":"2024-02-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"danielleloh"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":109,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":110,"author":{"gitId":"delishad21"},"content":"**Important:** Each person should have an unique email address. AB3 does not allow for duplicate email addressed to be added.","lastModifiedDate":"2024-03-03"},{"lineNumber":111,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":112,"author":{"gitId":"danielleloh"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":116,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2024-03-03"},{"lineNumber":117,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"Zer0Legion"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 m/A1234567Z`","lastModifiedDate":"2024-02-27"},{"lineNumber":121,"author":{"gitId":"Zer0Legion"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal m/A1234567Z`","lastModifiedDate":"2024-02-27"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2024-03-03"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2024-03-03"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":134,"author":{"gitId":"Zer0Legion"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG] [m/MATRICULATION_NUMBER]…​`","lastModifiedDate":"2024-02-27"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"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":"2024-03-03"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-03"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2024-03-03"},{"lineNumber":141,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"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":"2024-03-03"},{"lineNumber":145,"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":"2024-03-03"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"delishad21"},"content":"### Filtering persons: `find`","lastModifiedDate":"2024-03-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"delishad21"},"content":"* Filter persons based on specific criteria within their records.","lastModifiedDate":"2024-03-03"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"delishad21"},"content":"Format: `find PREFIX/KEYWORD`","lastModifiedDate":"2024-03-03"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"delishad21"},"content":"* This command searches for persons using a specific aspect of their details, as specified by the prefix.","lastModifiedDate":"2024-03-03"},{"lineNumber":154,"author":{"gitId":"delishad21"},"content":"* The search will return any result that contains the keyword as a substring under the indicated prefix. e.g. `find e/hans` will find any person that contains `hans` in their email.","lastModifiedDate":"2024-03-03"},{"lineNumber":155,"author":{"gitId":"delishad21"},"content":"* The search is case-insensitive. e.g. `hans` will match `Hans`.","lastModifiedDate":"2024-03-03"},{"lineNumber":156,"author":{"gitId":"delishad21"},"content":"* prefixes that are supported includes : n/, p/, e/, a/, m/ and t/.","lastModifiedDate":"2024-03-03"},{"lineNumber":157,"author":{"gitId":"delishad21"},"content":"* Only one prefix can be used for filtering at a time.","lastModifiedDate":"2024-03-03"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"delishad21"},"content":"* `find n/John` returns `john` and `John Doe`.","lastModifiedDate":"2024-03-03"},{"lineNumber":161,"author":{"gitId":"delishad21"},"content":"* `find n/alex` returns `Alex Yeoh`, `Davis Alex`.","lastModifiedDate":"2024-03-03"},{"lineNumber":162,"author":{"gitId":"delishad21"},"content":"* `find t/student` returns all persons tagged with `student` or any persons with tags that has `student` as a substring.","lastModifiedDate":"2024-03-03"},{"lineNumber":163,"author":{"gitId":"delishad21"},"content":"* `find p/1423` returns all persons with phone number containing `1423`.","lastModifiedDate":"2024-03-03"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"jayllo-c"},"content":"### Copy email addresses: `copy`","lastModifiedDate":"2024-02-27"},{"lineNumber":166,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":167,"author":{"gitId":"delishad21"},"content":"Copies the emails of currently displayed persons into your clipboard.","lastModifiedDate":"2024-03-03"},{"lineNumber":168,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":169,"author":{"gitId":"jayllo-c"},"content":"Format: `copy`","lastModifiedDate":"2024-02-27"},{"lineNumber":170,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":171,"author":{"gitId":"jayllo-c"},"content":"* Use `list` or `find` to get the list of people you would like to email.","lastModifiedDate":"2024-02-27"},{"lineNumber":172,"author":{"gitId":"jayllo-c"},"content":"* The emails are copied into your clipboard such that you may easily broadcast emails","lastModifiedDate":"2024-02-27"},{"lineNumber":173,"author":{"gitId":"jayllo-c"},"content":" to specific groups of people.","lastModifiedDate":"2024-02-27"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2024-03-03"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2024-03-03"},{"lineNumber":182,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-03"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2024-03-03"},{"lineNumber":187,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2024-03-03"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"danielleloh"},"content":"### Exporting Data to a CSV file : `export to csv`","lastModifiedDate":"2024-02-27"},{"lineNumber":196,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":197,"author":{"gitId":"delishad21"},"content":"Exports all persons and their details to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":198,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":199,"author":{"gitId":"danielleloh"},"content":"Format: `export to csv`","lastModifiedDate":"2024-02-27"},{"lineNumber":200,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":201,"author":{"gitId":"Pughal77"},"content":"### Importing Data from a CSV file : `import`","lastModifiedDate":"2024-02-27"},{"lineNumber":202,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":203,"author":{"gitId":"delishad21"},"content":"Imports all persons and their details from a CSV file from a specified file path.","lastModifiedDate":"2024-03-03"},{"lineNumber":204,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":205,"author":{"gitId":"Pughal77"},"content":"Format: `import FILEPATH`","lastModifiedDate":"2024-02-27"},{"lineNumber":206,"author":{"gitId":"delishad21"},"content":"- imports the persons saved in `FILEPATH` to `addressBook.json`","lastModifiedDate":"2024-03-03"},{"lineNumber":207,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":208,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"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":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":220,"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":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":225,"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":226,"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":227,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":229,"author":{"gitId":"Zer0Legion"},"content":"###","lastModifiedDate":"2024-02-27"},{"lineNumber":230,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":231,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"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":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":246,"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":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":248,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":250,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"Pughal77"},"content":"| Action | Format, Examples","lastModifiedDate":"2024-02-27"},{"lineNumber":253,"author":{"gitId":"Pughal77"},"content":"|--------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-02-27"},{"lineNumber":254,"author":{"gitId":"Pughal77"},"content":"| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG] [m/MATRICULATION_NUMBER]…​` e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` |","lastModifiedDate":"2024-02-27"},{"lineNumber":255,"author":{"gitId":"Pughal77"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-02-27"},{"lineNumber":256,"author":{"gitId":"Pughal77"},"content":"| **Delete** | `delete INDEX` e.g., `delete 3` |","lastModifiedDate":"2024-02-27"},{"lineNumber":257,"author":{"gitId":"Pughal77"},"content":"| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG] [m/MATRICULATION_NUMBER]…​` e.g.,`edit 2 n/James Lee e/jameslee@example.com` |","lastModifiedDate":"2024-02-27"},{"lineNumber":258,"author":{"gitId":"Pughal77"},"content":"| **Find** | `find PARAMETER KEYWORD` e.g., `find James` |","lastModifiedDate":"2024-02-27"},{"lineNumber":259,"author":{"gitId":"Pughal77"},"content":"| **Copy** | `copy` |","lastModifiedDate":"2024-02-27"},{"lineNumber":260,"author":{"gitId":"Pughal77"},"content":"| **List** | `list` |","lastModifiedDate":"2024-02-27"},{"lineNumber":261,"author":{"gitId":"Pughal77"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-02-27"},{"lineNumber":262,"author":{"gitId":"Pughal77"},"content":"| **Export to CSV** | `export to csv` |","lastModifiedDate":"2024-02-27"},{"lineNumber":263,"author":{"gitId":"Pughal77"},"content":"| **Import** | `import FILEPATH` |","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"danielleloh":9,"delishad21":34,"Pughal77":23,"Zer0Legion":14,"jayllo-c":8,"-":175}},{"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":"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":"Zer0Legion"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_MATRIC_NUMBER;","lastModifiedDate":"2024-02-27"},{"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-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":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"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":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":30,"author":{"gitId":"Zer0Legion"},"content":" + PREFIX_MATRIC_NUMBER + \"MATRICULATION NUMBER \"","lastModifiedDate":"2024-02-27"},{"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":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"Zer0Legion"},"content":" + PREFIX_MATRIC_NUMBER + \"A1234567X \"","lastModifiedDate":"2024-02-27"},{"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":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"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":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"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":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"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":{"Zer0Legion":3,"-":84}},{"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":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"Zer0Legion"},"content":" public static final Prefix PREFIX_MATRIC_NUMBER \u003d new Prefix(\"m/\");","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"Zer0Legion":1,"-":15}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"delishad21"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T10-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-1/tp/actions)","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"delishad21"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-1/tp/graph/badge.svg?token\u003d6NGZ4VS4VC)](https://app.codecov.io/gh/AY2324S2-CS2103T-T10-1/tp)","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"delishad21"},"content":"## Avengers Assemble","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"delishad21"},"content":"Avengers Assemble is a contact management app, meant for use with a Command Line Interface (CLI) while still maintaining the benefits of a Graphical User Interface (GUI).","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"delishad21"},"content":"The application is designed for Head Tutors of the CS1101S Programming Methodology course but its use cases can be extended to Head Tutors of other courses.","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"delishad21"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"delishad21"},"content":"### Project Links","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"delishad21"},"content":"[Project Website](https://ay2324s2-cs2103t-t10-1.github.io/tp/)","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"delishad21"},"content":"[User Guide](https://ay2324s2-cs2103t-t10-1.github.io/tp/UserGuide.html)","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"delishad21"},"content":"[Developer Guide](https://ay2324s2-cs2103t-t10-1.github.io/tp/DeveloperGuide.html)","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"delishad21"},"content":"[About Us](https://ay2324s2-cs2103t-t10-1.github.io/tp/AboutUs.html)","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"delishad21":16}},{"path":"build.gradle","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"plugins {","lastModifiedDate":"2016-08-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":" id \u0027java\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":" id \u0027checkstyle\u0027","lastModifiedDate":"2017-12-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":" id \u0027com.github.johnrengelman.shadow\u0027 version \u00277.1.2\u0027","lastModifiedDate":"2022-06-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":" id \u0027application\u0027","lastModifiedDate":"2016-12-08"},{"lineNumber":6,"author":{"gitId":"-"},"content":" id \u0027jacoco\u0027","lastModifiedDate":"2020-08-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"mainClassName \u003d \u0027seedu.address.Main\u0027","lastModifiedDate":"2019-02-08"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"sourceCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"targetCompatibility \u003d JavaVersion.VERSION_11","lastModifiedDate":"2019-02-20"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"repositories {","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":" mavenCentral()","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" maven { url \u0027https://oss.sonatype.org/content/repositories/snapshots/\u0027 }","lastModifiedDate":"2018-04-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"checkstyle {","lastModifiedDate":"2016-10-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" toolVersion \u003d \u002710.2\u0027","lastModifiedDate":"2022-04-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-10-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":"test {","lastModifiedDate":"2018-03-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" useJUnitPlatform()","lastModifiedDate":"2018-03-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" finalizedBy jacocoTestReport","lastModifiedDate":"2020-08-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-08-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"task coverage(type: JacocoReport) {","lastModifiedDate":"2020-08-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":" sourceDirectories.from files(sourceSets.main.allSource.srcDirs)","lastModifiedDate":"2020-08-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":" classDirectories.from files(sourceSets.main.output)","lastModifiedDate":"2020-08-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" executionData.from files(jacocoTestReport.executionData)","lastModifiedDate":"2020-08-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" afterEvaluate {","lastModifiedDate":"2020-08-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":" classDirectories.from files(classDirectories.files.collect {","lastModifiedDate":"2020-08-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":" fileTree(dir: it, exclude: [\u0027**/*.jar\u0027])","lastModifiedDate":"2020-08-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":" })","lastModifiedDate":"2020-08-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":" reports {","lastModifiedDate":"2020-08-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":" html.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":" xml.required \u003d true","lastModifiedDate":"2022-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-08-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-03-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"dependencies {","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String jUnitVersion \u003d \u00275.4.0\u0027","lastModifiedDate":"2019-02-10"},{"lineNumber":45,"author":{"gitId":"-"},"content":" String javaFxVersion \u003d \u002717.0.7\u0027","lastModifiedDate":"2023-07-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":48,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":49,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-base\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":50,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":51,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":52,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-controls\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":53,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":54,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":55,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-fxml\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":56,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027win\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":57,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027mac\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":58,"author":{"gitId":"-"},"content":" implementation group: \u0027org.openjfx\u0027, name: \u0027javafx-graphics\u0027, version: javaFxVersion, classifier: \u0027linux\u0027","lastModifiedDate":"2019-02-19"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.core\u0027, name: \u0027jackson-databind\u0027, version: \u00272.7.0\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" implementation group: \u0027com.fasterxml.jackson.datatype\u0027, name: \u0027jackson-datatype-jsr310\u0027, version: \u00272.7.4\u0027","lastModifiedDate":"2018-03-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" testImplementation group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-api\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" testRuntimeOnly group: \u0027org.junit.jupiter\u0027, name: \u0027junit-jupiter-engine\u0027, version: jUnitVersion","lastModifiedDate":"2018-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"shadowJar {","lastModifiedDate":"2016-08-29"},{"lineNumber":69,"author":{"gitId":"Zer0Legion"},"content":" archiveFileName \u003d \u0027avengersassemble.jar\u0027","lastModifiedDate":"2024-03-04"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":72,"author":{"gitId":"-"},"content":"defaultTasks \u0027clean\u0027, \u0027test\u0027","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Zer0Legion":1,"-":71}},{"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":"jayllo-c"},"content":"### Johan Soo","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"delishad21"},"content":"\u003cimg src\u003d\"images/delishad21.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"delishad21"},"content":"[[github](https://github.com/delishad21)]","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"delishad21"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"delishad21"},"content":"* Responsibilities: Develop Code","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jayllo-c"},"content":"### Ang Leng Khai","lastModifiedDate":"2024-02-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Zer0Legion"},"content":"\u003cimg src\u003d\"images/zer0legion.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Zer0Legion"},"content":"[[github](http://github.com/zer0legion)] ","lastModifiedDate":"2024-02-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"Zer0Legion"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":30,"author":{"gitId":"Zer0Legion"},"content":"* Responsibilities: Develop code","lastModifiedDate":"2024-02-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"danielleloh"},"content":"### Loh Sze Han, Danielle","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"danielleloh"},"content":"\u003cimg src\u003d\"images/danielleloh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"danielleloh"},"content":"[[github](http://github.com/danielleloh)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":39,"author":{"gitId":"danielleloh"},"content":"* Responsibilities: Develop code","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"jayllo-c"},"content":"### Pughal Raj","lastModifiedDate":"2024-02-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"Pughal77"},"content":"\u003cimg src\u003d\"images/pughal77.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Pughal77"},"content":"[[github](http://github.com/Pughal77)]","lastModifiedDate":"2024-02-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":48,"author":{"gitId":"Pughal77"},"content":"* Responsibilities: Develop code","lastModifiedDate":"2024-02-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"jayllo-c"},"content":"### Castillo James","lastModifiedDate":"2024-02-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"jayllo-c"},"content":"\u003cimg src\u003d\"images/jayllo-c.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"jayllo-c"},"content":"[[github](http://github.com/jayllo-c)]","lastModifiedDate":"2024-02-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-26"},{"lineNumber":57,"author":{"gitId":"jayllo-c"},"content":"* Responsibilities: Develop Code","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"danielleloh":4,"delishad21":4,"Pughal77":3,"Zer0Legion":4,"jayllo-c":7,"-":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":"Zer0Legion"},"content":"# Avengers Assemble Developer Guide","lastModifiedDate":"2024-02-27"},{"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":"Zer0Legion"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-27"},{"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":"Zer0Legion"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.)","lastModifiedDate":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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-03-03"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-02-28"},{"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":"2024-03-03"},{"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":"2024-03-03"},{"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":"2024-03-03"},{"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":"delishad21"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2024-03-03"},{"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":"Zer0Legion"},"content":"* Name: Sarah Johnson","lastModifiedDate":"2024-02-27"},{"lineNumber":278,"author":{"gitId":"Zer0Legion"},"content":"* Age: 23","lastModifiedDate":"2024-02-27"},{"lineNumber":279,"author":{"gitId":"Zer0Legion"},"content":"* Occupation: Head Tutor for CS1101S","lastModifiedDate":"2024-02-27"},{"lineNumber":280,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":281,"author":{"gitId":"Zer0Legion"},"content":"* head tutor for CS1101S course","lastModifiedDate":"2024-02-27"},{"lineNumber":282,"author":{"gitId":"Zer0Legion"},"content":"* has a need to manage various aspects of course administration","lastModifiedDate":"2024-02-27"},{"lineNumber":283,"author":{"gitId":"Zer0Legion"},"content":"* has a need to schedule classes","lastModifiedDate":"2024-02-27"},{"lineNumber":284,"author":{"gitId":"Zer0Legion"},"content":"* has a need to coordinate with teaching assistants","lastModifiedDate":"2024-02-27"},{"lineNumber":285,"author":{"gitId":"Zer0Legion"},"content":"* has a need to effectively communicate with students","lastModifiedDate":"2024-02-27"},{"lineNumber":286,"author":{"gitId":"delishad21"},"content":"* has a need to manage a significant number of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":287,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":290,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"Zer0Legion"},"content":"**Value proposition**:","lastModifiedDate":"2024-02-27"},{"lineNumber":293,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":294,"author":{"gitId":"delishad21"},"content":"* manage persons faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-03"},{"lineNumber":295,"author":{"gitId":"delishad21"},"content":"* Centralised platform to store and manage person details for all relevant individuals involved in course administration","lastModifiedDate":"2024-03-03"},{"lineNumber":296,"author":{"gitId":"delishad21"},"content":"* Easier access to information through organising relevant persons into different subgroups","lastModifiedDate":"2024-03-03"},{"lineNumber":297,"author":{"gitId":"Zer0Legion"},"content":"* Direct linkages to students’ schoolwork for easier tracking","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"Zer0Legion"},"content":"* Able to set up the address book through different data-loading options","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"Zer0Legion"},"content":"* Able to assist with management of large scale communication","lastModifiedDate":"2024-02-27"},{"lineNumber":300,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":301,"author":{"gitId":"Zer0Legion"},"content":"**Problem Scope**:","lastModifiedDate":"2024-02-27"},{"lineNumber":302,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":303,"author":{"gitId":"Zer0Legion"},"content":"* The CS1101S Head Tutor will face challenges in effectively organising and managing contact information within the department due to the large scale the course has to operate on. Existing methods, such as paper-based lists or basic digital spreadsheets, lack the necessary functionality to efficiently handle the diverse needs of proper contact management. There is a need for a user-friendly and offline-capable address book solution tailored specifically to the needs of a single user. This address book system should provide features such as easy contact entry and editing, quick search functionality, customizable categorization options, and the ability to add notes for each contact. Additionally, it should operate offline without requiring an internet connection and should not rely on complex database management systems.","lastModifiedDate":"2024-02-27"},{"lineNumber":304,"author":{"gitId":"Zer0Legion"},"content":"* While the address book system will greatly improve contact management and organisation for the CS1101S Head Tutor, it will not address broader departmental communication or collaboration needs beyond individual contact management since the address book is designed to be a single-user system. It will not facilitate communication between users or provide collaboration tools for group projects or tasks. Additionally, the address book system will not handle complex data analysis or reporting functions beyond basic contact information management. Finally, while the system will provide offline functionality, it will not offer real-time synchronisation with online databases or cloud storage solutions.","lastModifiedDate":"2024-02-27"},{"lineNumber":305,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"Zer0Legion"},"content":"|----------|---------------------------------------------|----------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | potential user exploring the app | see the app populated with sample data | immediately see an example of the app in use |","lastModifiedDate":"2024-02-27"},{"lineNumber":315,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | new user | easily clear the example data | start using the app with real-life data |","lastModifiedDate":"2024-02-27"},{"lineNumber":316,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"delishad21"},"content":"| `* * *` | new user | add persons with their details | start populating the address book |","lastModifiedDate":"2024-03-03"},{"lineNumber":318,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | new user | save the data I input into the app | don\u0027t lose the information I\u0027ve entered |","lastModifiedDate":"2024-02-27"},{"lineNumber":319,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2024-03-03"},{"lineNumber":320,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2024-03-03"},{"lineNumber":321,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | update and edit person details | keep my address book accurate |","lastModifiedDate":"2024-03-03"},{"lineNumber":322,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":323,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":324,"author":{"gitId":"delishad21"},"content":"| `* * *` | head tutor using the app | categorise my persons into groups | manage different tutorial groups effectively |","lastModifiedDate":"2024-03-03"},{"lineNumber":325,"author":{"gitId":"Zer0Legion"},"content":"| `* * *` | head tutor using the app | copy email addresses of a group | effectively communicate with target groups |","lastModifiedDate":"2024-02-27"},{"lineNumber":326,"author":{"gitId":"delishad21"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2024-03-03"},{"lineNumber":327,"author":{"gitId":"delishad21"},"content":"| `* *` | user | hide private person details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2024-03-03"},{"lineNumber":328,"author":{"gitId":"Zer0Legion"},"content":"| `* *` | experienced user | use the address book offline | update and interact with it anywhere |","lastModifiedDate":"2024-02-27"},{"lineNumber":329,"author":{"gitId":"delishad21"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2024-03-03"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"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":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"delishad21"},"content":"**Use case: UC01 — Delete a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"delishad21"},"content":"1. User !!requests to list persons (UC04)!!","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-03"},{"lineNumber":344,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2024-03-03"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"danielleloh"},"content":"**Use case: UC02 — Help**","lastModifiedDate":"2024-02-29"},{"lineNumber":361,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":362,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":363,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":364,"author":{"gitId":"Zer0Legion"},"content":"1. User requests help information.","lastModifiedDate":"2024-02-27"},{"lineNumber":365,"author":{"gitId":"Zer0Legion"},"content":"2. AddressBook displays help information.","lastModifiedDate":"2024-02-27"},{"lineNumber":366,"author":{"gitId":"Zer0Legion"},"content":"3. User reads the help information.","lastModifiedDate":"2024-02-27"},{"lineNumber":367,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":368,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":369,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":370,"author":{"gitId":"delishad21"},"content":"**Use case: UC03 — Add a person**","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":372,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":373,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":374,"author":{"gitId":"delishad21"},"content":"1. User requests to add a new person and inputs details for the new person.","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"delishad21"},"content":"2. AddressBook saves the new person\u0027s information.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"delishad21"},"content":"3. AddressBook confirms the addition of the new person.","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":378,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":379,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":380,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":381,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":382,"author":{"gitId":"delishad21"},"content":"* 1a. User does not input all compulsory parameters along with the person.","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":384,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook prompts the user on the proper usage of the command.","lastModifiedDate":"2024-02-27"},{"lineNumber":385,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":386,"author":{"gitId":"Zer0Legion"},"content":" Step 1a1 is repeated until the data entered is correct.","lastModifiedDate":"2024-02-27"},{"lineNumber":387,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":388,"author":{"gitId":"delishad21"},"content":"* 1b. User tries to add a person with an existing email address.","lastModifiedDate":"2024-03-03"},{"lineNumber":389,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":390,"author":{"gitId":"danielleloh"},"content":" * 1b1. AddressBook displays and error message informing the user that the email address already exists.","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"danielleloh"},"content":" Step 1b1 is repeated until a valid email address if entered.","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"delishad21"},"content":"**Use case: UC04 — List all persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":395,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":396,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":397,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":398,"author":{"gitId":"delishad21"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":399,"author":{"gitId":"delishad21"},"content":"2. AddressBook shows the list of persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":400,"author":{"gitId":"delishad21"},"content":"3. User views the list of persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":401,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":402,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":403,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":404,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":405,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":406,"author":{"gitId":"Zer0Legion"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":407,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":408,"author":{"gitId":"Zer0Legion"},"content":" * 2a1. AddressBook displays a message indicating that the list is empty.","lastModifiedDate":"2024-02-27"},{"lineNumber":409,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":410,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":411,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":412,"author":{"gitId":"delishad21"},"content":"**Use case: UC05 — Edit a person\u0027s details**","lastModifiedDate":"2024-03-03"},{"lineNumber":413,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":414,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":415,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":416,"author":{"gitId":"delishad21"},"content":"1. User requests to edit a specific person with updated details.","lastModifiedDate":"2024-03-03"},{"lineNumber":417,"author":{"gitId":"Zer0Legion"},"content":"2. AddressBook saves the updated details.","lastModifiedDate":"2024-02-27"},{"lineNumber":418,"author":{"gitId":"Zer0Legion"},"content":"3. AddressBook confirms the successful update.","lastModifiedDate":"2024-02-27"},{"lineNumber":419,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":420,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":421,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":422,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":423,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":424,"author":{"gitId":"delishad21"},"content":"* 1a. User does not input enough parameters along with the person.","lastModifiedDate":"2024-03-03"},{"lineNumber":425,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":426,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook prompts the user on the proper usage of the command.","lastModifiedDate":"2024-02-27"},{"lineNumber":427,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":428,"author":{"gitId":"Zer0Legion"},"content":" Step 1a1 is repeated until the data entered is correct.","lastModifiedDate":"2024-02-27"},{"lineNumber":429,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":430,"author":{"gitId":"delishad21"},"content":"* 1b. The selected person does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":431,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":432,"author":{"gitId":"delishad21"},"content":" * 1b1. AddressBook displays an error message indicating that the person does not exist.","lastModifiedDate":"2024-03-03"},{"lineNumber":433,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":434,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":435,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":436,"author":{"gitId":"delishad21"},"content":"**Use case: UC06 — Find persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":437,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":438,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":439,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":440,"author":{"gitId":"delishad21"},"content":"1. User requests to find a specific person matching the search criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":441,"author":{"gitId":"delishad21"},"content":"2. AddressBook displays a list of persons matching the criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":442,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":443,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":444,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":445,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":446,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":447,"author":{"gitId":"delishad21"},"content":"* 1a. No persons match the search criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":448,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":449,"author":{"gitId":"delishad21"},"content":" * 1a1. AddressBook displays a message indicating that no persons match the criteria.","lastModifiedDate":"2024-03-03"},{"lineNumber":450,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":451,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":452,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":453,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":454,"author":{"gitId":"delishad21"},"content":"**Use case: UC07 — Import persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":455,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":456,"author":{"gitId":"Pughal77"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":457,"author":{"gitId":"delishad21"},"content":"1. User requests to import persons from a csv file.","lastModifiedDate":"2024-03-03"},{"lineNumber":458,"author":{"gitId":"delishad21"},"content":"2. AddressBook displays a message that all persons have been imported.","lastModifiedDate":"2024-03-03"},{"lineNumber":459,"author":{"gitId":"delishad21"},"content":"3. User is able to see all the persons imported when a list of persons is requested.","lastModifiedDate":"2024-03-03"},{"lineNumber":460,"author":{"gitId":"danielleloh"},"content":" Use case ends.","lastModifiedDate":"2024-03-01"},{"lineNumber":461,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":462,"author":{"gitId":"Pughal77"},"content":"**Extension**","lastModifiedDate":"2024-02-29"},{"lineNumber":463,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":464,"author":{"gitId":"danielleloh"},"content":"* 1a. AddressBook cannot find file to be imported.","lastModifiedDate":"2024-03-01"},{"lineNumber":465,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":466,"author":{"gitId":"danielleloh"},"content":" * 1a1. AddressBook displays a message indicating that the file is not recognised.","lastModifiedDate":"2024-03-01"},{"lineNumber":467,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":468,"author":{"gitId":"Pughal77"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":469,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":470,"author":{"gitId":"danielleloh"},"content":"* 1b. The file to be imported is not a csv file.","lastModifiedDate":"2024-03-01"},{"lineNumber":471,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":472,"author":{"gitId":"Pughal77"},"content":" * 1b1. AddressBook displays an error message indicating that the file type is not recognised and should be a csv file","lastModifiedDate":"2024-02-29"},{"lineNumber":473,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":474,"author":{"gitId":"Pughal77"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":475,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":476,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":477,"author":{"gitId":"danielleloh"},"content":"**Use case: UC08 — Copy email addresses**","lastModifiedDate":"2024-03-01"},{"lineNumber":478,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":479,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-03-01"},{"lineNumber":480,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":481,"author":{"gitId":"delishad21"},"content":"1. User requests to copy emails of currently displayed persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":482,"author":{"gitId":"delishad21"},"content":"2. AddressBook copies the emails of currently displayed persons","lastModifiedDate":"2024-03-03"},{"lineNumber":483,"author":{"gitId":"jayllo-c"},"content":"into user\u0027s clipboard.","lastModifiedDate":"2024-02-28"},{"lineNumber":484,"author":{"gitId":"jayllo-c"},"content":"3. AddressBook notifies the user that emails have been copied.","lastModifiedDate":"2024-02-28"},{"lineNumber":485,"author":{"gitId":"jayllo-c"},"content":"4. User can paste emails when composing emails.","lastModifiedDate":"2024-02-28"},{"lineNumber":486,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":487,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":488,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":489,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-03-01"},{"lineNumber":490,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":491,"author":{"gitId":"delishad21"},"content":"* 2a. No persons currently displayed.","lastModifiedDate":"2024-03-03"},{"lineNumber":492,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":493,"author":{"gitId":"jayllo-c"},"content":" * 2a1. AddressBook displays a message indicating that","lastModifiedDate":"2024-02-28"},{"lineNumber":494,"author":{"gitId":"delishad21"},"content":" no persons are currently displayed.","lastModifiedDate":"2024-03-03"},{"lineNumber":495,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":496,"author":{"gitId":"jayllo-c"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":497,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":498,"author":{"gitId":"delishad21"},"content":"**Use case: UC09 — Clear all persons**","lastModifiedDate":"2024-03-03"},{"lineNumber":499,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":500,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":501,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":502,"author":{"gitId":"delishad21"},"content":"1. User requests to clear all persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":503,"author":{"gitId":"delishad21"},"content":"2. AddressBook clears all persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":504,"author":{"gitId":"delishad21"},"content":"3. AddressBook displays a message indicating that all persons have been cleared.","lastModifiedDate":"2024-03-03"},{"lineNumber":505,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":506,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":507,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":508,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":509,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":510,"author":{"gitId":"Zer0Legion"},"content":"* 1a. User inputs extraneous parameters.","lastModifiedDate":"2024-02-27"},{"lineNumber":511,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":512,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook displays a message indicating that an extraneous parameter was found, and confirms User\u0027s intention.","lastModifiedDate":"2024-02-27"},{"lineNumber":513,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":514,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":515,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":516,"author":{"gitId":"delishad21"},"content":"**Use case: UC10 — Export persons to CSV**","lastModifiedDate":"2024-03-03"},{"lineNumber":517,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":518,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":519,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":520,"author":{"gitId":"delishad21"},"content":"1. User requests to export all persons and details to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":521,"author":{"gitId":"delishad21"},"content":"2. AddressBook exports the persons to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":522,"author":{"gitId":"delishad21"},"content":"3. AddressBook displays a message to confirm that all persons have been exported to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":523,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":524,"author":{"gitId":"danielleloh"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":525,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":526,"author":{"gitId":"danielleloh"},"content":"**Use case: UC11 — Exit application**","lastModifiedDate":"2024-03-01"},{"lineNumber":527,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":528,"author":{"gitId":"danielleloh"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":529,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":530,"author":{"gitId":"Zer0Legion"},"content":"1. User requests to exit the application.","lastModifiedDate":"2024-02-27"},{"lineNumber":531,"author":{"gitId":"Zer0Legion"},"content":"2. AddressBook exits the application.","lastModifiedDate":"2024-02-27"},{"lineNumber":532,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":533,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":534,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":535,"author":{"gitId":"danielleloh"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":536,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":537,"author":{"gitId":"Zer0Legion"},"content":"* 1a. User inputs extraneous parameters.","lastModifiedDate":"2024-02-27"},{"lineNumber":538,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":539,"author":{"gitId":"Zer0Legion"},"content":" * 1a1. AddressBook displays a message indicating that an extraneous parameter was found, and confirms User\u0027s intention.","lastModifiedDate":"2024-02-27"},{"lineNumber":540,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":541,"author":{"gitId":"Zer0Legion"},"content":" Use case ends.","lastModifiedDate":"2024-02-27"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"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":546,"author":{"gitId":"delishad21"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":547,"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":548,"author":{"gitId":"delishad21"},"content":"4. A user should be able to import up to 1000 persons from an external source without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":549,"author":{"gitId":"Zer0Legion"},"content":"5. The application should provide comprehensive documentation and help resources to assist users in understanding how to use the software effectively.","lastModifiedDate":"2024-02-27"},{"lineNumber":550,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":551,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":557,"author":{"gitId":"delishad21"},"content":"* **Private person detail**: A person detail that is not meant to be shared with others","lastModifiedDate":"2024-03-03"},{"lineNumber":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":566,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":567,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":568,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":571,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":572,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":573,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":574,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":575,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":576,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":577,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":578,"author":{"gitId":"delishad21"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample persons. The window size may not be optimum.","lastModifiedDate":"2024-03-03"},{"lineNumber":579,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":580,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":581,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":582,"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":583,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":584,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":585,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":586,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":587,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":588,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":589,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2024-03-03"},{"lineNumber":590,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":591,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2024-03-03"},{"lineNumber":592,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":593,"author":{"gitId":"delishad21"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2024-03-03"},{"lineNumber":594,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":595,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":596,"author":{"gitId":"delishad21"},"content":" Expected: First person is deleted from the list. Details of the deleted person shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-03"},{"lineNumber":597,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":598,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":599,"author":{"gitId":"delishad21"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2024-03-03"},{"lineNumber":600,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":601,"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":602,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":603,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":604,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":605,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":606,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":607,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":608,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":609,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":610,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":611,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":612,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"danielleloh":34,"delishad21":60,"Pughal77":14,"Zer0Legion":123,"jayllo-c":8,"-":373}},{"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":"Zer0Legion"},"content":"# Avengers Assemble User Guide","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Zer0Legion"},"content":"Avengers Assemble (AA) 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, AA can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-04"},{"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":"Zer0Legion"},"content":"1. Download the latest `avengersassemble.jar`.","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"Zer0Legion"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"Zer0Legion"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar avengersassemble.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"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":"delishad21"},"content":" * `list` : Lists all persons.","lastModifiedDate":"2024-03-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Zer0Legion"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 m/A1234567Z` : Adds a person named `John Doe` to AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"delishad21"},"content":" * `delete 3` : Deletes the 3rd person shown in the current list.","lastModifiedDate":"2024-03-03"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"delishad21"},"content":" * `clear` : Deletes all persons.","lastModifiedDate":"2024-03-03"},{"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":"delishad21"},"content":"* Some commands require you to include parameters. These parameters are identified by prefixes.","lastModifiedDate":"2024-03-03"},{"lineNumber":52,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":53,"author":{"gitId":"delishad21"},"content":"* Here are a list of valid prefixes and what they each refer to.","lastModifiedDate":"2024-03-03"},{"lineNumber":54,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":55,"author":{"gitId":"delishad21"},"content":"| Prefix | What it refers to |","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"delishad21"},"content":"|--------|---------------------------|","lastModifiedDate":"2024-03-03"},{"lineNumber":57,"author":{"gitId":"delishad21"},"content":"|n/ | Name of the person |","lastModifiedDate":"2024-03-03"},{"lineNumber":58,"author":{"gitId":"delishad21"},"content":"|p/ | Phone number of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":59,"author":{"gitId":"delishad21"},"content":"|e/ | Email of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":60,"author":{"gitId":"delishad21"},"content":"|a/ | Address of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":61,"author":{"gitId":"delishad21"},"content":"|t/ | Tags of person |","lastModifiedDate":"2024-03-03"},{"lineNumber":62,"author":{"gitId":"delishad21"},"content":"|m/ | Matriculation ID of person|","lastModifiedDate":"2024-03-03"},{"lineNumber":63,"author":{"gitId":"delishad21"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"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":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"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":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"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":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"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":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"Pughal77"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will **not** be ignored.\u003cbr\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":77,"author":{"gitId":"Pughal77"},"content":" e.g. if the command specifies `help 123`, it will no longer be interpreted as `help` instead an error will be thrown.","lastModifiedDate":"2024-02-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":79,"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":80,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":92,"author":{"gitId":"Pughal77"},"content":"### Parameters:","lastModifiedDate":"2024-02-27"},{"lineNumber":93,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":94,"author":{"gitId":"Zer0Legion"},"content":"* n/NAME","lastModifiedDate":"2024-02-27"},{"lineNumber":95,"author":{"gitId":"Zer0Legion"},"content":"* p/PHONE_NUMBER","lastModifiedDate":"2024-02-27"},{"lineNumber":96,"author":{"gitId":"Zer0Legion"},"content":"* e/EMAIL","lastModifiedDate":"2024-02-27"},{"lineNumber":97,"author":{"gitId":"Zer0Legion"},"content":"* a/ADDRESS","lastModifiedDate":"2024-02-27"},{"lineNumber":98,"author":{"gitId":"Zer0Legion"},"content":"* t/TAG (Optional)","lastModifiedDate":"2024-02-27"},{"lineNumber":99,"author":{"gitId":"Zer0Legion"},"content":"* m/MATRICULATION_NUMBER (Optional)","lastModifiedDate":"2024-02-27"},{"lineNumber":100,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":101,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2024-03-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"Zer0Legion"},"content":"Adds a person to AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":106,"author":{"gitId":"Zer0Legion"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG] [m/MATRICULATION_NUMBER]…​`","lastModifiedDate":"2024-02-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"danielleloh"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":109,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":110,"author":{"gitId":"Zer0Legion"},"content":"**Important:** Each person should have an unique email address. AA does not allow for duplicate email addressed to be added.","lastModifiedDate":"2024-03-04"},{"lineNumber":111,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":112,"author":{"gitId":"danielleloh"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":116,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2024-03-03"},{"lineNumber":117,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"Zer0Legion"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 m/A1234567Z`","lastModifiedDate":"2024-02-27"},{"lineNumber":121,"author":{"gitId":"Zer0Legion"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal m/A1234567Z`","lastModifiedDate":"2024-02-27"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2024-03-03"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"Zer0Legion"},"content":"Shows a list of all persons in AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2024-03-03"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"Zer0Legion"},"content":"Edits an existing person in AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":134,"author":{"gitId":"Zer0Legion"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG] [m/MATRICULATION_NUMBER]…​`","lastModifiedDate":"2024-02-27"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"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":"2024-03-03"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-03"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2024-03-03"},{"lineNumber":141,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"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":"2024-03-03"},{"lineNumber":145,"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":"2024-03-03"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"delishad21"},"content":"### Filtering persons: `find`","lastModifiedDate":"2024-03-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"delishad21"},"content":"* Filter persons based on specific criteria within their records.","lastModifiedDate":"2024-03-03"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"delishad21"},"content":"Format: `find PREFIX/KEYWORD`","lastModifiedDate":"2024-03-03"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"delishad21"},"content":"* This command searches for persons using a specific aspect of their details, as specified by the prefix.","lastModifiedDate":"2024-03-03"},{"lineNumber":154,"author":{"gitId":"delishad21"},"content":"* The search will return any result that contains the keyword as a substring under the indicated prefix. e.g. `find e/hans` will find any person that contains `hans` in their email.","lastModifiedDate":"2024-03-03"},{"lineNumber":155,"author":{"gitId":"delishad21"},"content":"* The search is case-insensitive. e.g. `hans` will match `Hans`.","lastModifiedDate":"2024-03-03"},{"lineNumber":156,"author":{"gitId":"delishad21"},"content":"* prefixes that are supported includes : n/, p/, e/, a/, m/ and t/.","lastModifiedDate":"2024-03-03"},{"lineNumber":157,"author":{"gitId":"delishad21"},"content":"* Only one prefix can be used for filtering at a time.","lastModifiedDate":"2024-03-03"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"delishad21"},"content":"* `find n/John` returns `john` and `John Doe`.","lastModifiedDate":"2024-03-03"},{"lineNumber":161,"author":{"gitId":"delishad21"},"content":"* `find n/alex` returns `Alex Yeoh`, `Davis Alex`.","lastModifiedDate":"2024-03-03"},{"lineNumber":162,"author":{"gitId":"delishad21"},"content":"* `find t/student` returns all persons tagged with `student` or any persons with tags that has `student` as a substring.","lastModifiedDate":"2024-03-03"},{"lineNumber":163,"author":{"gitId":"delishad21"},"content":"* `find p/1423` returns all persons with phone number containing `1423`.","lastModifiedDate":"2024-03-03"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"jayllo-c"},"content":"### Copy email addresses: `copy`","lastModifiedDate":"2024-02-27"},{"lineNumber":166,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":167,"author":{"gitId":"delishad21"},"content":"Copies the emails of currently displayed persons into your clipboard.","lastModifiedDate":"2024-03-03"},{"lineNumber":168,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":169,"author":{"gitId":"jayllo-c"},"content":"Format: `copy`","lastModifiedDate":"2024-02-27"},{"lineNumber":170,"author":{"gitId":"jayllo-c"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":171,"author":{"gitId":"jayllo-c"},"content":"* Use `list` or `find` to get the list of people you would like to email.","lastModifiedDate":"2024-02-27"},{"lineNumber":172,"author":{"gitId":"jayllo-c"},"content":"* The emails are copied into your clipboard such that you may easily broadcast emails","lastModifiedDate":"2024-02-27"},{"lineNumber":173,"author":{"gitId":"jayllo-c"},"content":" to specific groups of people.","lastModifiedDate":"2024-02-27"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2024-03-03"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"Zer0Legion"},"content":"Deletes the specified person from AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2024-03-03"},{"lineNumber":182,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-03"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"Zer0Legion"},"content":"* `list` followed by `delete 2` deletes the 2nd person in AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2024-03-03"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"Zer0Legion"},"content":"Clears all entries from AA.","lastModifiedDate":"2024-03-04"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"danielleloh"},"content":"### Exporting Data to a CSV file : `export to csv`","lastModifiedDate":"2024-02-27"},{"lineNumber":196,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":197,"author":{"gitId":"delishad21"},"content":"Exports all persons and their details to a CSV file.","lastModifiedDate":"2024-03-03"},{"lineNumber":198,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":199,"author":{"gitId":"danielleloh"},"content":"Format: `export to csv`","lastModifiedDate":"2024-02-27"},{"lineNumber":200,"author":{"gitId":"danielleloh"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":201,"author":{"gitId":"Pughal77"},"content":"### Importing Data from a CSV file : `import`","lastModifiedDate":"2024-02-27"},{"lineNumber":202,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":203,"author":{"gitId":"delishad21"},"content":"Imports all persons and their details from a CSV file from a specified file path.","lastModifiedDate":"2024-03-03"},{"lineNumber":204,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":205,"author":{"gitId":"Pughal77"},"content":"Format: `import FILEPATH`","lastModifiedDate":"2024-02-27"},{"lineNumber":206,"author":{"gitId":"Zer0Legion"},"content":"- imports the persons saved in `FILEPATH` to `avengersassemble.json`","lastModifiedDate":"2024-03-04"},{"lineNumber":207,"author":{"gitId":"Pughal77"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":208,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"Zer0Legion"},"content":"AA 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-04"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":220,"author":{"gitId":"Zer0Legion"},"content":"AA data are saved automatically as a JSON file `[JAR file location]/data/avengersassemble.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-04"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":225,"author":{"gitId":"Zer0Legion"},"content":"If your changes to the data file makes its format invalid, AA 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-04"},{"lineNumber":226,"author":{"gitId":"Zer0Legion"},"content":"Furthermore, certain edits can cause AA 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-04"},{"lineNumber":227,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":229,"author":{"gitId":"Zer0Legion"},"content":"###","lastModifiedDate":"2024-02-27"},{"lineNumber":230,"author":{"gitId":"Zer0Legion"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":231,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"Zer0Legion"},"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 AA home folder.","lastModifiedDate":"2024-03-04"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":246,"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":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":248,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":250,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"Pughal77"},"content":"| Action | Format, Examples","lastModifiedDate":"2024-02-27"},{"lineNumber":253,"author":{"gitId":"Pughal77"},"content":"|--------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-02-27"},{"lineNumber":254,"author":{"gitId":"Pughal77"},"content":"| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG] [m/MATRICULATION_NUMBER]…​` e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` |","lastModifiedDate":"2024-02-27"},{"lineNumber":255,"author":{"gitId":"Pughal77"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-02-27"},{"lineNumber":256,"author":{"gitId":"Pughal77"},"content":"| **Delete** | `delete INDEX` e.g., `delete 3` |","lastModifiedDate":"2024-02-27"},{"lineNumber":257,"author":{"gitId":"Pughal77"},"content":"| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG] [m/MATRICULATION_NUMBER]…​` e.g.,`edit 2 n/James Lee e/jameslee@example.com` |","lastModifiedDate":"2024-02-27"},{"lineNumber":258,"author":{"gitId":"Pughal77"},"content":"| **Find** | `find PARAMETER KEYWORD` e.g., `find James` |","lastModifiedDate":"2024-02-27"},{"lineNumber":259,"author":{"gitId":"Pughal77"},"content":"| **Copy** | `copy` |","lastModifiedDate":"2024-02-27"},{"lineNumber":260,"author":{"gitId":"Pughal77"},"content":"| **List** | `list` |","lastModifiedDate":"2024-02-27"},{"lineNumber":261,"author":{"gitId":"Pughal77"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-02-27"},{"lineNumber":262,"author":{"gitId":"Pughal77"},"content":"| **Export to CSV** | `export to csv` |","lastModifiedDate":"2024-02-27"},{"lineNumber":263,"author":{"gitId":"Pughal77"},"content":"| **Import** | `import FILEPATH` |","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"danielleloh":9,"delishad21":31,"Pughal77":23,"Zer0Legion":33,"jayllo-c":8,"-":159}},{"path":"docs/tutorials/AddRemark.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Tutorial: Adding a command\"","lastModifiedDate":"2020-07-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# Tutorial: Adding a command","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"Let\u0027s walk you through the implementation of a new command — `remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"This command allows users of the AddressBook application to add optional remarks to people in their address book and edit it if required. The command should have the following format:","lastModifiedDate":"2020-07-29"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"`remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`)","lastModifiedDate":"2020-07-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"We’ll assume that you have already set up the development environment as outlined in the Developer’s Guide.","lastModifiedDate":"2020-07-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## Create a new `remark` command","lastModifiedDate":"2020-07-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"Looking in the `logic.command` package, you will notice that each existing command have their own class. All the commands inherit from the abstract class `Command` which means that they must override `execute()`. Each `Command` returns an instance of `CommandResult` upon success and `CommandResult#feedbackToUser` is printed to the `ResultDisplay`.","lastModifiedDate":"2020-07-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory.","lastModifiedDate":"2020-07-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"For now, let’s keep `RemarkCommand` as simple as possible and print some output. We accomplish that by returning a `CommandResult` with an accompanying message.","lastModifiedDate":"2020-07-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2020-07-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2020-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Changes the remark of an existing person in the address book.","lastModifiedDate":"2020-07-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"remark\";","lastModifiedDate":"2020-07-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2020-07-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new CommandResult(\"Hello from remark\");","lastModifiedDate":"2020-07-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":"### Hook `RemarkCommand` into the application","lastModifiedDate":"2020-07-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":"Now that we have our `RemarkCommand` ready to be executed, we need to update `AddressBookParser#parseCommand()` to recognize the `remark` keyword. Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`.","lastModifiedDate":"2020-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee).","lastModifiedDate":"2022-01-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"### Run the application","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"Run `Main#main` and try out your new `RemarkCommand`. If everything went well, you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"![Output displayed](../images/add-remark/RemarkHello.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"## Change `RemarkCommand` to throw an exception","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":"While we have successfully printed a message to `ResultDisplay`, the command does not do what it is supposed to do. Let’s change the command to throw a `CommandException` to accurately reflect that our command is still a work in progress.","lastModifiedDate":"2020-12-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"../diagrams/add-remark/RemarkClass.puml\" alt\u003d\"The relationship between RemarkCommand and Command\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":"Following the convention in other commands, we add relevant messages as constants and use them.","lastModifiedDate":"2020-07-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2021-08-01"},{"lineNumber":71,"author":{"gitId":"-"},"content":" + \": Edits the remark of the person identified \"","lastModifiedDate":"2021-08-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":" + \"by the index number used in the last person listing. \"","lastModifiedDate":"2020-07-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" + \"Existing remark will be overwritten by the input.\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2020-07-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" + \"r/ [REMARK]\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2020-07-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" + \"r/ Likes to swim.\";","lastModifiedDate":"2020-07-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_IMPLEMENTED_YET \u003d","lastModifiedDate":"2021-08-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"Remark command not implemented yet\";","lastModifiedDate":"2021-08-01"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET);","lastModifiedDate":"2020-07-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"## Enhancing `RemarkCommand`","lastModifiedDate":"2020-07-29"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` to parse input from the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"### Make the command accept parameters","lastModifiedDate":"2020-07-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"We start by modifying the constructor of `RemarkCommand` to accept an `Index` and a `String`. While we are at it, let’s change the error message to echo the values. While this is not a replacement for tests, it is an obvious way to tell if our code is functioning as intended.","lastModifiedDate":"2020-07-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2020-07-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ARGUMENTS \u003d \"Index: %1$d, Remark: %2$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":103,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":104,"author":{"gitId":"-"},"content":" private final String remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit the remark","lastModifiedDate":"2020-07-29"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @param remark of the person to be updated to","lastModifiedDate":"2020-07-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public RemarkCommand(Index index, String remark) {","lastModifiedDate":"2020-07-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":" requireAllNonNull(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":113,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2020-07-29"},{"lineNumber":114,"author":{"gitId":"-"},"content":" this.remark \u003d remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":" throw new CommandException(","lastModifiedDate":"2021-08-01"},{"lineNumber":119,"author":{"gitId":"-"},"content":" String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark));","lastModifiedDate":"2021-08-01"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2020-07-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2020-07-29"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2020-07-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2020-07-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":" if (!(other instanceof RemarkCommand)) {","lastModifiedDate":"2020-07-29"},{"lineNumber":130,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2020-07-29"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":" RemarkCommand e \u003d (RemarkCommand) other;","lastModifiedDate":"2020-07-29"},{"lineNumber":134,"author":{"gitId":"-"},"content":" return index.equals(e.index)","lastModifiedDate":"2020-07-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":" \u0026\u0026 remark.equals(e.remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":138,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Your code should look something like [this](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-a8e35af8f9c251525063fae36c9852922a7e7195763018eacec60f3a4d87c594) after you are done.","lastModifiedDate":"2022-01-02"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"### Parse user input","lastModifiedDate":"2020-07-29"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. The class must extend the `Parser` interface.","lastModifiedDate":"2020-07-29"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":148,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"../diagrams/add-remark/ParserClass.puml\" alt\u003d\"The relationship between Parser and RemarkCommandParser\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Thankfully, `ArgumentTokenizer#tokenize()` makes it trivial to parse user input. Let’s take a look at the JavaDoc provided for the function to understand what it does.","lastModifiedDate":"2020-07-29"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":152,"author":{"gitId":"-"},"content":"**`ArgumentTokenizer.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":154,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap}","lastModifiedDate":"2020-07-29"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * object that maps prefixes to their respective argument values. Only the","lastModifiedDate":"2020-07-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":" * given prefixes will be recognized in the arguments string.","lastModifiedDate":"2020-07-29"},{"lineNumber":159,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-07-29"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form:","lastModifiedDate":"2020-07-29"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2020-07-29"},{"lineNumber":162,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2020-07-29"},{"lineNumber":163,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their","lastModifiedDate":"2020-07-29"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * arguments","lastModifiedDate":"2020-07-29"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":166,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":168,"author":{"gitId":"-"},"content":"We can tell `ArgumentTokenizer#tokenize()` to look out for our new prefix `r/` and it will return us an instance of `ArgumentMultimap`. Now let’s find out what we need to do in order to obtain the Index and String that we need. Let’s look through `ArgumentMultimap` :","lastModifiedDate":"2020-07-29"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**`ArgumentMultimap.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":172,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":173,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2020-07-29"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":"public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2020-07-29"},{"lineNumber":177,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2020-07-29"},{"lineNumber":178,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() :","lastModifiedDate":"2020-07-29"},{"lineNumber":179,"author":{"gitId":"-"},"content":" Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2020-07-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":181,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":183,"author":{"gitId":"-"},"content":"This appears to be what we need to get a String of the remark. But what about the Index? Let\u0027s take a quick peek at existing `Command` that uses an index to see how it is done.","lastModifiedDate":"2020-07-29"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":185,"author":{"gitId":"-"},"content":"**`DeleteCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":187,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":189,"author":{"gitId":"-"},"content":"return new DeleteCommand(index);","lastModifiedDate":"2020-07-29"},{"lineNumber":190,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":192,"author":{"gitId":"-"},"content":"There appears to be another utility class that obtains an `Index` from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Now that we have the know-how to extract the data that we need from the user’s input, we can parse the user command and create a new instance of `RemarkCommand`, as given below.","lastModifiedDate":"2020-07-29"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**`RemarkCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":198,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":199,"author":{"gitId":"-"},"content":"public RemarkCommand parse(String args) throws ParseException {","lastModifiedDate":"2020-07-29"},{"lineNumber":200,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":201,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(args,","lastModifiedDate":"2020-07-29"},{"lineNumber":202,"author":{"gitId":"-"},"content":" PREFIX_REMARK);","lastModifiedDate":"2020-07-29"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":204,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":205,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-07-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2020-07-29"},{"lineNumber":207,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2020-07-29"},{"lineNumber":208,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2020-07-29"},{"lineNumber":209,"author":{"gitId":"-"},"content":" RemarkCommand.MESSAGE_USAGE), ive);","lastModifiedDate":"2020-07-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":212,"author":{"gitId":"-"},"content":" String remark \u003d argMultimap.getValue(PREFIX_REMARK).orElse(\"\");","lastModifiedDate":"2020-07-29"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":214,"author":{"gitId":"-"},"content":" return new RemarkCommand(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":215,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":216,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":218,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":220,"author":{"gitId":"-"},"content":"Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`!","lastModifiedDate":"2023-09-12"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":224,"author":{"gitId":"-"},"content":"If you are stuck, check out the sample","lastModifiedDate":"2020-07-29"},{"lineNumber":225,"author":{"gitId":"-"},"content":"[here](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-8bf239e8e9529369b577701303ddd96af93178b4ed6735f91c2d8488b20c6b4a).","lastModifiedDate":"2022-01-02"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":227,"author":{"gitId":"-"},"content":"## Add `Remark` to the model","lastModifiedDate":"2020-07-29"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":229,"author":{"gitId":"-"},"content":"Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of person data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person’s name). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person.","lastModifiedDate":"2020-07-29"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":231,"author":{"gitId":"-"},"content":"### Add a new `Remark` class","lastModifiedDate":"2020-07-29"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":233,"author":{"gitId":"-"},"content":"Create a new `Remark` in `seedu.address.model.person`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code.","lastModifiedDate":"2020-07-29"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"A copy-paste and search-replace later, you should have something like [this](https://github.com/se-edu/addressbook-level3/commit/4516e099699baa9e2d51801bd26f016d812dedcc#diff-41bb13c581e280c686198251ad6cc337cd5e27032772f06ed9bf7f1440995ece). Note how `Remark` has no constrains and thus does not require input","lastModifiedDate":"2022-01-02"},{"lineNumber":236,"author":{"gitId":"-"},"content":"validation.","lastModifiedDate":"2020-07-29"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":238,"author":{"gitId":"-"},"content":"### Make use of `Remark`","lastModifiedDate":"2020-07-29"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":240,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. These should be relatively simple changes.","lastModifiedDate":"2020-07-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":242,"author":{"gitId":"-"},"content":"## Add a placeholder element for remark to the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":244,"author":{"gitId":"-"},"content":"Without getting too deep into `fxml`, let’s go on a 5 minute adventure to get some placeholder text to show up for each person.","lastModifiedDate":"2020-07-29"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":246,"author":{"gitId":"-"},"content":"Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688).","lastModifiedDate":"2022-01-02"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":248,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":250,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":251,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-07-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"private Label remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":253,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":256,"author":{"gitId":"-"},"content":"`@FXML` is an annotation that marks a private or protected field and makes it accessible to FXML. It might sound like Greek to you right now, don’t worry — we will get back to it later.","lastModifiedDate":"2020-07-29"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":258,"author":{"gitId":"-"},"content":"Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9).","lastModifiedDate":"2022-01-02"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"**`PersonListCard.fxml`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":262,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-07-29"},{"lineNumber":263,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"remark\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$remark\" /\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":264,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":266,"author":{"gitId":"-"},"content":"That’s it! Fire up the application again and you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"![$remark shows up in each entry](../images/add-remark/$Remark.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":270,"author":{"gitId":"-"},"content":"## Modify `Person` to support a `Remark` field","lastModifiedDate":"2020-07-29"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"Since `PersonCard` displays data from a `Person`, we need to update `Person` to get our `Remark` displayed!","lastModifiedDate":"2020-07-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### Modify `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":276,"author":{"gitId":"-"},"content":"We change the constructor of `Person` to take a `Remark`. We will also need to define new fields and accessors accordingly to store our new addition.","lastModifiedDate":"2020-07-29"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":278,"author":{"gitId":"-"},"content":"### Update other usages of `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":280,"author":{"gitId":"-"},"content":"Unfortunately, a change to `Person` will cause other commands to break, you will have to modify these commands to use the updated `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":282,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":284,"author":{"gitId":"-"},"content":"Use the `Find Usages` feature in IntelliJ IDEA on the `Person` class to find these commands.","lastModifiedDate":"2023-09-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":286,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Refer to [this commit](https://github.com/se-edu/addressbook-level3/commit/ce998c37e65b92d35c91d28c7822cd139c2c0a5c) and check that you have got everything in order!","lastModifiedDate":"2020-07-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":291,"author":{"gitId":"-"},"content":"## Updating Storage","lastModifiedDate":"2020-07-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":293,"author":{"gitId":"-"},"content":"AddressBook stores data by serializing `JsonAdaptedPerson` into `json` with the help of an external library — Jackson. Let’s update `JsonAdaptedPerson` to work with our new `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":295,"author":{"gitId":"-"},"content":"While the changes to code may be minimal, the test data will have to be updated as well.","lastModifiedDate":"2020-07-29"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":297,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":299,"author":{"gitId":"Zer0Legion"},"content":"You must delete AddressBook’s storage file located at `/data/avengersassemble.json` before running it! Not doing so will cause AddressBook to default to an empty address book!","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":301,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"Check out [this commit](https://github.com/se-edu/addressbook-level3/commit/556cbd0e03ff224d7a68afba171ad2eb0ce56bbf)","lastModifiedDate":"2020-07-29"},{"lineNumber":304,"author":{"gitId":"-"},"content":"to see what the changes entail.","lastModifiedDate":"2020-07-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"## Finalizing the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":308,"author":{"gitId":"-"},"content":"Now that we have finalized the `Person` class and its dependencies, we can now bind the `Remark` field to the UI.","lastModifiedDate":"2020-07-29"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":310,"author":{"gitId":"-"},"content":"Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/commit/5b98fee11b6b3f5749b6b943c4f3bd3aa049b692)","lastModifiedDate":"2020-07-29"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":314,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":315,"author":{"gitId":"-"},"content":"public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2020-07-29"},{"lineNumber":316,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":317,"author":{"gitId":"-"},"content":" remark.setText(person.getRemark().value);","lastModifiedDate":"2020-07-29"},{"lineNumber":318,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":319,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":321,"author":{"gitId":"-"},"content":"![The remark label is bound properly!](../images/add-remark/RemarkBound.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":323,"author":{"gitId":"-"},"content":"## Putting everything together","lastModifiedDate":"2020-07-29"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":325,"author":{"gitId":"-"},"content":"After the previous step, we notice a peculiar regression — we went from displaying something to nothing at all. However, this is expected behavior as we are yet to update the `RemarkCommand` to make use of the code we\u0027ve been adding in the last few steps.","lastModifiedDate":"2020-07-29"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":327,"author":{"gitId":"-"},"content":"### Update `RemarkCommand` and `RemarkCommandParser`","lastModifiedDate":"2020-07-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":"In this last step, we modify `RemarkCommand#execute()` to change the `Remark` of a `Person`. Since all fields in a `Person` are immutable, we create a new instance of a `Person` with the values that we want and","lastModifiedDate":"2020-07-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"save it with `Model#setPerson()`.","lastModifiedDate":"2020-07-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ADD_REMARK_SUCCESS \u003d \"Added remark to Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_REMARK_SUCCESS \u003d \"Removed remark from Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":338,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":341,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2020-07-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2020-07-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2020-07-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-07-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new Person(","lastModifiedDate":"2021-08-01"},{"lineNumber":349,"author":{"gitId":"-"},"content":" personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),","lastModifiedDate":"2021-08-01"},{"lineNumber":350,"author":{"gitId":"-"},"content":" personToEdit.getAddress(), remark, personToEdit.getTags());","lastModifiedDate":"2020-07-29"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-07-29"},{"lineNumber":353,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-07-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":355,"author":{"gitId":"-"},"content":" return new CommandResult(generateSuccessMessage(editedPerson));","lastModifiedDate":"2020-07-29"},{"lineNumber":356,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":358,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":359,"author":{"gitId":"-"},"content":" * Generates a command execution success message based on whether","lastModifiedDate":"2021-08-01"},{"lineNumber":360,"author":{"gitId":"-"},"content":" * the remark is added to or removed from","lastModifiedDate":"2021-08-01"},{"lineNumber":361,"author":{"gitId":"-"},"content":" * {@code personToEdit}.","lastModifiedDate":"2020-07-29"},{"lineNumber":362,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":363,"author":{"gitId":"-"},"content":" private String generateSuccessMessage(Person personToEdit) {","lastModifiedDate":"2020-07-29"},{"lineNumber":364,"author":{"gitId":"-"},"content":" String message \u003d !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;","lastModifiedDate":"2020-07-29"},{"lineNumber":365,"author":{"gitId":"-"},"content":" return String.format(message, personToEdit);","lastModifiedDate":"2020-07-29"},{"lineNumber":366,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":367,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":369,"author":{"gitId":"-"},"content":"![Congratulations!](../images/add-remark/RemarkComplete.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":371,"author":{"gitId":"-"},"content":"## Writing tests","lastModifiedDate":"2020-07-29"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":373,"author":{"gitId":"-"},"content":"Tests are crucial to ensuring that bugs don’t slip into the codebase unnoticed. This is especially true for large code bases where a change might lead to unintended behavior.","lastModifiedDate":"2020-07-29"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":375,"author":{"gitId":"-"},"content":"Let’s verify the correctness of our code by writing some tests!","lastModifiedDate":"2020-07-29"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":377,"author":{"gitId":"-"},"content":"Of course you can simply add the test cases manually, like you\u0027ve been doing all along this tutorial. The result would be like the test cases in [here](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01). Alternatively, you can get the help of IntelliJ to generate the skeletons of the test cases, as explained in the next section.","lastModifiedDate":"2022-01-02"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Automatically generating tests","lastModifiedDate":"2020-07-29"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":381,"author":{"gitId":"-"},"content":"The goal is to write effective and efficient tests to ensure that `RemarkCommand#execute()` behaves as expected.","lastModifiedDate":"2020-07-29"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":383,"author":{"gitId":"-"},"content":"The convention for test names is `methodName_testScenario_expectedResult`. An example would be","lastModifiedDate":"2020-07-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"`execute_filteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"Let’s create a test for `RemarkCommand#execute()` to test that adding a remark works. On `IntelliJ IDEA` you can bring up the context menu and choose to `Go To` \\\u003e `Test` or use the appropriate keyboard shortcut.","lastModifiedDate":"2020-07-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":388,"author":{"gitId":"-"},"content":"![Using the context menu to jump to tests](../images/add-remark/ContextMenu.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":390,"author":{"gitId":"-"},"content":"Then, create a test for the `execute` method.","lastModifiedDate":"2020-07-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":392,"author":{"gitId":"-"},"content":"![Creating a test for `execute`.](../images/add-remark/CreateTest.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":394,"author":{"gitId":"-"},"content":"Following convention, let’s change the name of the generated method to `execute_addRemarkUnfilteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":396,"author":{"gitId":"-"},"content":"Let’s use the utility functions provided in `CommandTestUtil`. The functions ensure that commands produce the expected `CommandResult` and output the correct message. In this case, `CommandTestUtil#assertCommandSuccess` is the best fit as we are testing that a `RemarkCommand` will successfully add a `Remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"You should end up with a test that looks something like [this](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49).","lastModifiedDate":"2022-01-02"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":400,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-07-29"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":402,"author":{"gitId":"-"},"content":"This concludes the tutorial for adding a new `Command` to AddressBook.","lastModifiedDate":"2020-07-29"}],"authorContributionMap":{"Zer0Legion":1,"-":401}},{"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":"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":"Zer0Legion"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_MATRIC_NUMBER;","lastModifiedDate":"2024-02-27"},{"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-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":"-"},"content":"public class AddCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"add\";","lastModifiedDate":"2016-08-24"},{"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":"-"},"content":" + PREFIX_ADDRESS + \"ADDRESS \"","lastModifiedDate":"2017-05-09"},{"lineNumber":30,"author":{"gitId":"Zer0Legion"},"content":" + PREFIX_MATRIC_NUMBER + \"MATRICULATION NUMBER \"","lastModifiedDate":"2024-02-27"},{"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":"-"},"content":" + PREFIX_ADDRESS + \"311, Clementi Ave 2, #02-25 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"Zer0Legion"},"content":" + PREFIX_MATRIC_NUMBER + \"A1234567X \"","lastModifiedDate":"2024-02-27"},{"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":"-"},"content":" public AddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"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":"-"},"content":" if (!(other instanceof AddCommand)) {","lastModifiedDate":"2023-07-13"},{"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":"-"},"content":" AddCommand otherAddCommand \u003d (AddCommand) other;","lastModifiedDate":"2023-07-13"},{"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":{"Zer0Legion":3,"-":84}},{"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":"-"},"content":" public static final Prefix PREFIX_ADDRESS \u003d new Prefix(\"a/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public static final Prefix PREFIX_TAG \u003d new Prefix(\"t/\");","lastModifiedDate":"2017-02-11"},{"lineNumber":14,"author":{"gitId":"Zer0Legion"},"content":" public static final Prefix PREFIX_MATRIC_NUMBER \u003d new Prefix(\"m/\");","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-11"}],"authorContributionMap":{"Zer0Legion":1,"-":15}},{"path":"src/main/java/seedu/address/model/UserPrefs.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model;","lastModifiedDate":"2016-08-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-11-27"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2016-09-24"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Represents User\u0027s preferences.","lastModifiedDate":"2016-08-08"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class UserPrefs implements ReadOnlyUserPrefs {","lastModifiedDate":"2018-11-27"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private GuiSettings guiSettings \u003d new GuiSettings();","lastModifiedDate":"2018-11-27"},{"lineNumber":17,"author":{"gitId":"Zer0Legion"},"content":" private Path addressBookFilePath \u003d Paths.get(\"data\" , \"avengersassemble.json\");","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with default values.","lastModifiedDate":"2018-12-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public UserPrefs() {}","lastModifiedDate":"2018-12-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Creates a {@code UserPrefs} with the prefs in {@code userPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public UserPrefs(ReadOnlyUserPrefs userPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this();","lastModifiedDate":"2018-12-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" resetData(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Resets the existing data of this {@code UserPrefs} with {@code newUserPrefs}.","lastModifiedDate":"2018-12-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void resetData(ReadOnlyUserPrefs newUserPrefs) {","lastModifiedDate":"2018-12-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireNonNull(newUserPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" setGuiSettings(newUserPrefs.getGuiSettings());","lastModifiedDate":"2018-12-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" setAddressBookFilePath(newUserPrefs.getAddressBookFilePath());","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public GuiSettings getGuiSettings() {","lastModifiedDate":"2016-08-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return guiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void setGuiSettings(GuiSettings guiSettings) {","lastModifiedDate":"2018-08-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.guiSettings \u003d guiSettings;","lastModifiedDate":"2016-08-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-04-21"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath(Path addressBookFilePath) {","lastModifiedDate":"2018-04-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" requireNonNull(addressBookFilePath);","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.addressBookFilePath \u003d addressBookFilePath;","lastModifiedDate":"2017-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" if (!(other instanceof UserPrefs)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2016-09-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" UserPrefs otherUserPrefs \u003d (UserPrefs) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return guiSettings.equals(otherUserPrefs.guiSettings)","lastModifiedDate":"2023-07-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u0026\u0026 addressBookFilePath.equals(otherUserPrefs.addressBookFilePath);","lastModifiedDate":"2023-07-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Objects.hash(guiSettings, addressBookFilePath);","lastModifiedDate":"2018-08-09"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-09-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-02-25"},{"lineNumber":83,"author":{"gitId":"-"},"content":" sb.append(\"Gui Settings : \" + guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":84,"author":{"gitId":"-"},"content":" sb.append(\"\\nLocal data file location : \" + addressBookFilePath);","lastModifiedDate":"2017-02-25"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-02-25"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":88,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"Zer0Legion":1,"-":87}},{"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":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-12-09"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-12-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.nio.file.AccessDeniedException;","lastModifiedDate":"2023-06-13"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-12-09"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;","lastModifiedDate":"2019-04-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2018-12-09"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.CommandResult;","lastModifiedDate":"2017-01-18"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.ListCommand;","lastModifiedDate":"2017-06-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2016-09-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import seedu.address.model.ModelManager;","lastModifiedDate":"2016-09-21"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-12-09"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2017-05-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-12-09"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonAddressBookStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import seedu.address.storage.JsonUserPrefsStorage;","lastModifiedDate":"2018-12-09"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import seedu.address.storage.StorageManager;","lastModifiedDate":"2018-12-09"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2018-12-09"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class LogicManagerTest {","lastModifiedDate":"2016-09-22"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_IO_EXCEPTION \u003d new IOException(\"dummy IO exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final IOException DUMMY_AD_EXCEPTION \u003d new AccessDeniedException(\"dummy access denied exception\");","lastModifiedDate":"2023-06-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public Path temporaryFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private Model model \u003d new ModelManager();","lastModifiedDate":"2017-06-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private Logic logic;","lastModifiedDate":"2018-12-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @BeforeEach","lastModifiedDate":"2019-04-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void setUp() {","lastModifiedDate":"2019-04-25"},{"lineNumber":48,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d","lastModifiedDate":"2019-04-25"},{"lineNumber":49,"author":{"gitId":"Zer0Legion"},"content":" new JsonAddressBookStorage(temporaryFolder.resolve(\"avengersassemble.json\"));","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d new JsonUserPrefsStorage(temporaryFolder.resolve(\"userPrefs.json\"));","lastModifiedDate":"2019-04-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2018-12-09"},{"lineNumber":52,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2018-12-09"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-20"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void execute_invalidCommandFormat_throwsParseException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String invalidCommand \u003d \"uicfhmowqewca\";","lastModifiedDate":"2017-06-20"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND);","lastModifiedDate":"2017-06-20"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void execute_commandExecutionError_throwsCommandException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":63,"author":{"gitId":"-"},"content":" String deleteCommand \u003d \"delete 9\";","lastModifiedDate":"2017-06-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2017-06-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void execute_validCommand_success() throws Exception {","lastModifiedDate":"2019-03-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String listCommand \u003d ListCommand.COMMAND_WORD;","lastModifiedDate":"2017-06-19"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model);","lastModifiedDate":"2017-06-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-20"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-20"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-12-09"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void execute_storageThrowsIoException_throwsCommandException() {","lastModifiedDate":"2019-04-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_IO_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":76,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_ERROR_FORMAT, DUMMY_IO_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-06-13"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-06-13"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void execute_storageThrowsAdException_throwsCommandException() {","lastModifiedDate":"2023-06-13"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertCommandFailureForExceptionFromStorage(DUMMY_AD_EXCEPTION, String.format(","lastModifiedDate":"2023-06-13"},{"lineNumber":82,"author":{"gitId":"-"},"content":" LogicManager.FILE_OPS_PERMISSION_ERROR_FORMAT, DUMMY_AD_EXCEPTION.getMessage()));","lastModifiedDate":"2023-06-13"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e logic.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-09-21"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * - no exceptions are thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" * - the feedback message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private void assertCommandSuccess(String inputCommand, String expectedMessage,","lastModifiedDate":"2019-03-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Model expectedModel) throws CommandException, ParseException {","lastModifiedDate":"2019-03-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":" CommandResult result \u003d logic.execute(inputCommand);","lastModifiedDate":"2019-03-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, result.getFeedbackToUser());","lastModifiedDate":"2019-03-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2019-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a ParseException is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":108,"author":{"gitId":"-"},"content":" private void assertParseException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-03-11"},{"lineNumber":109,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, ParseException.class, expectedMessage);","lastModifiedDate":"2017-03-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-11"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-11"},{"lineNumber":112,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-14"},{"lineNumber":113,"author":{"gitId":"-"},"content":" * Executes the command, confirms that a CommandException is thrown and that the result message is correct.","lastModifiedDate":"2017-06-14"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":115,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-14"},{"lineNumber":116,"author":{"gitId":"-"},"content":" private void assertCommandException(String inputCommand, String expectedMessage) {","lastModifiedDate":"2017-06-14"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, CommandException.class, expectedMessage);","lastModifiedDate":"2017-06-14"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-14"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-14"},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-11"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Executes the command, confirms that the exception is thrown and that the result message is correct.","lastModifiedDate":"2017-03-11"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * @see #assertCommandFailure(String, Class, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":123,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-11"},{"lineNumber":124,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" String expectedMessage) {","lastModifiedDate":"2019-03-14"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Model expectedModel \u003d new ModelManager(model.getAddressBook(), new UserPrefs());","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel);","lastModifiedDate":"2019-03-14"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":130,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Executes the command and confirms that","lastModifiedDate":"2019-03-14"},{"lineNumber":132,"author":{"gitId":"-"},"content":" * - the {@code expectedException} is thrown \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":133,"author":{"gitId":"-"},"content":" * - the resulting error message is equal to {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * - the internal model manager state is the same as that in {@code expectedModel} \u003cbr\u003e","lastModifiedDate":"2019-03-14"},{"lineNumber":135,"author":{"gitId":"-"},"content":" * @see #assertCommandSuccess(String, String, Model)","lastModifiedDate":"2019-03-14"},{"lineNumber":136,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-21"},{"lineNumber":137,"author":{"gitId":"-"},"content":" private void assertCommandFailure(String inputCommand, Class\u003c? extends Throwable\u003e expectedException,","lastModifiedDate":"2019-03-14"},{"lineNumber":138,"author":{"gitId":"-"},"content":" String expectedMessage, Model expectedModel) {","lastModifiedDate":"2017-05-31"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertThrows(expectedException, expectedMessage, () -\u003e logic.execute(inputCommand));","lastModifiedDate":"2019-03-14"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, model);","lastModifiedDate":"2017-05-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Tests the Logic component\u0027s handling of an {@code IOException} thrown by the Storage component.","lastModifiedDate":"2023-06-13"},{"lineNumber":145,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-13"},{"lineNumber":146,"author":{"gitId":"-"},"content":" * @param e the exception to be thrown by the Storage component","lastModifiedDate":"2023-06-13"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @param expectedMessage the message expected inside exception thrown by the Logic component","lastModifiedDate":"2023-06-13"},{"lineNumber":148,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":149,"author":{"gitId":"-"},"content":" private void assertCommandFailureForExceptionFromStorage(IOException e, String expectedMessage) {","lastModifiedDate":"2023-06-13"},{"lineNumber":150,"author":{"gitId":"-"},"content":" Path prefPath \u003d temporaryFolder.resolve(\"ExceptionUserPrefs.json\");","lastModifiedDate":"2023-06-13"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":152,"author":{"gitId":"-"},"content":" // Inject LogicManager with an AddressBookStorage that throws the IOException e when saving","lastModifiedDate":"2023-06-13"},{"lineNumber":153,"author":{"gitId":"-"},"content":" JsonAddressBookStorage addressBookStorage \u003d new JsonAddressBookStorage(prefPath) {","lastModifiedDate":"2023-06-13"},{"lineNumber":154,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-12-09"},{"lineNumber":155,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath)","lastModifiedDate":"2023-06-13"},{"lineNumber":156,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2023-06-13"},{"lineNumber":157,"author":{"gitId":"-"},"content":" throw e;","lastModifiedDate":"2023-06-13"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":159,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2023-06-13"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":161,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage userPrefsStorage \u003d","lastModifiedDate":"2023-06-13"},{"lineNumber":162,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(temporaryFolder.resolve(\"ExceptionUserPrefs.json\"));","lastModifiedDate":"2023-06-13"},{"lineNumber":163,"author":{"gitId":"-"},"content":" StorageManager storage \u003d new StorageManager(addressBookStorage, userPrefsStorage);","lastModifiedDate":"2023-06-13"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":165,"author":{"gitId":"-"},"content":" logic \u003d new LogicManager(model, storage);","lastModifiedDate":"2023-06-13"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-06-13"},{"lineNumber":167,"author":{"gitId":"-"},"content":" // Triggers the saveAddressBook method by executing an add command","lastModifiedDate":"2023-06-13"},{"lineNumber":168,"author":{"gitId":"-"},"content":" String addCommand \u003d AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY","lastModifiedDate":"2023-06-13"},{"lineNumber":169,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY;","lastModifiedDate":"2023-06-13"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2023-06-13"},{"lineNumber":171,"author":{"gitId":"-"},"content":" ModelManager expectedModel \u003d new ModelManager();","lastModifiedDate":"2023-06-13"},{"lineNumber":172,"author":{"gitId":"-"},"content":" expectedModel.addPerson(expectedPerson);","lastModifiedDate":"2023-06-13"},{"lineNumber":173,"author":{"gitId":"-"},"content":" assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel);","lastModifiedDate":"2023-06-13"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"Zer0Legion":1,"-":174}},{"path":"src/test/java/seedu/address/storage/JsonUserPrefsStorageTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.storage;","lastModifiedDate":"2016-09-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-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.assertFalse;","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-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-04-21"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.io.TempDir;","lastModifiedDate":"2019-04-25"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.DataLoadingException;","lastModifiedDate":"2023-06-14"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.model.UserPrefs;","lastModifiedDate":"2016-09-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class JsonUserPrefsStorageTest {","lastModifiedDate":"2016-10-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path TEST_DATA_FOLDER \u003d Paths.get(\"src\", \"test\", \"data\", \"JsonUserPrefsStorageTest\");","lastModifiedDate":"2018-04-21"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @TempDir","lastModifiedDate":"2019-04-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Path testFolder;","lastModifiedDate":"2019-04-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void readUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e readUserPrefs(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private Optional\u003cUserPrefs\u003e readUserPrefs(String userPrefsFileInTestDataFolder) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Path prefsFilePath \u003d addToTestDataPathIfNotNull(userPrefsFileInTestDataFolder);","lastModifiedDate":"2018-04-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return new JsonUserPrefsStorage(prefsFilePath).readUserPrefs(prefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public void readUserPrefs_missingFile_emptyResult() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertFalse(readUserPrefs(\"NonExistentFile.json\").isPresent());","lastModifiedDate":"2016-09-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void readUserPrefs_notJsonFormat_exceptionThrown() {","lastModifiedDate":"2019-03-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertThrows(DataLoadingException.class, () -\u003e readUserPrefs(\"NotJsonFormatUserPrefs.json\"));","lastModifiedDate":"2023-06-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private Path addToTestDataPathIfNotNull(String userPrefsFileInTestDataFolder) {","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" return userPrefsFileInTestDataFolder !\u003d null","lastModifiedDate":"2016-09-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" ? TEST_DATA_FOLDER.resolve(userPrefsFileInTestDataFolder)","lastModifiedDate":"2018-04-21"},{"lineNumber":49,"author":{"gitId":"-"},"content":" : null;","lastModifiedDate":"2016-09-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void readUserPrefs_fileInOrder_successfullyRead() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"TypicalUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public void readUserPrefs_valuesMissingFromFile_defaultValuesUsed() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"EmptyUserPrefs.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public void readUserPrefs_extraValuesInFile_extraValuesIgnored() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":" UserPrefs expected \u003d getTypicalUserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":68,"author":{"gitId":"-"},"content":" UserPrefs actual \u003d readUserPrefs(\"ExtraValuesUserPref.json\").get();","lastModifiedDate":"2016-09-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(expected, actual);","lastModifiedDate":"2016-09-24"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" private UserPrefs getTypicalUserPrefs() {","lastModifiedDate":"2017-02-25"},{"lineNumber":74,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-02-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1000, 500, 300, 100));","lastModifiedDate":"2018-11-27"},{"lineNumber":76,"author":{"gitId":"Zer0Legion"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"avengersassemble.json\"));","lastModifiedDate":"2024-03-04"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return userPrefs;","lastModifiedDate":"2017-02-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-25"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void savePrefs_nullPrefs_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e saveUserPrefs(null, \"SomeFile.json\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void saveUserPrefs_nullFilePath_throwsNullPointerException() {","lastModifiedDate":"2017-08-15"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e saveUserPrefs(new UserPrefs(), null));","lastModifiedDate":"2019-03-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-15"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Saves {@code userPrefs} at the specified {@code prefsFileInTestDataFolder} filepath.","lastModifiedDate":"2017-08-15"},{"lineNumber":92,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-15"},{"lineNumber":93,"author":{"gitId":"-"},"content":" private void saveUserPrefs(UserPrefs userPrefs, String prefsFileInTestDataFolder) {","lastModifiedDate":"2017-08-15"},{"lineNumber":94,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":95,"author":{"gitId":"-"},"content":" new JsonUserPrefsStorage(addToTestDataPathIfNotNull(prefsFileInTestDataFolder))","lastModifiedDate":"2016-10-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":" .saveUserPrefs(userPrefs);","lastModifiedDate":"2016-10-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"-"},"content":" throw new AssertionError(\"There should not be an error writing to the file\", ioe);","lastModifiedDate":"2017-08-15"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2016-09-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" public void saveUserPrefs_allInOrder_success() throws DataLoadingException, IOException {","lastModifiedDate":"2023-06-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":105,"author":{"gitId":"-"},"content":" UserPrefs original \u003d new UserPrefs();","lastModifiedDate":"2016-09-24"},{"lineNumber":106,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(1200, 200, 0, 2));","lastModifiedDate":"2018-11-27"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Path pefsFilePath \u003d testFolder.resolve(\"TempPrefs.json\");","lastModifiedDate":"2019-04-25"},{"lineNumber":109,"author":{"gitId":"-"},"content":" JsonUserPrefsStorage jsonUserPrefsStorage \u003d new JsonUserPrefsStorage(pefsFilePath);","lastModifiedDate":"2016-10-01"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":111,"author":{"gitId":"-"},"content":" //Try writing when the file doesn\u0027t exist","lastModifiedDate":"2016-09-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":113,"author":{"gitId":"-"},"content":" UserPrefs readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":" //Try saving when the file exists","lastModifiedDate":"2016-09-24"},{"lineNumber":117,"author":{"gitId":"-"},"content":" original.setGuiSettings(new GuiSettings(5, 5, 5, 5));","lastModifiedDate":"2018-11-27"},{"lineNumber":118,"author":{"gitId":"-"},"content":" jsonUserPrefsStorage.saveUserPrefs(original);","lastModifiedDate":"2016-10-01"},{"lineNumber":119,"author":{"gitId":"-"},"content":" readBack \u003d jsonUserPrefsStorage.readUserPrefs().get();","lastModifiedDate":"2016-10-01"},{"lineNumber":120,"author":{"gitId":"-"},"content":" assertEquals(original, readBack);","lastModifiedDate":"2016-09-24"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-24"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-24"},{"lineNumber":123,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-24"}],"authorContributionMap":{"Zer0Legion":1,"-":122}}] diff --git a/AY2324S2-CS2103T-T10-1_tp_master/commits.json b/AY2324S2-CS2103T-T10-1_tp_master/commits.json index d48b0164..e928c247 100644 --- a/AY2324S2-CS2103T-T10-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T10-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"danielleloh":[{"date":"2024-02-26","commitResults":[{"hash":"ed9d7c2c6e65d06203e8fc38567274da14cf63db","isMergeCommit":false,"messageTitle":"docs: add section for danielle loh","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"e5172e2189b97411d0db519415034fd5e4f569e6","isMergeCommit":false,"messageTitle":"docs: update danielle\u0027s section in aboutus.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c52ea3fa49a29780868d547cb0f12a27d9673265","isMergeCommit":false,"messageTitle":"fix: edit role and responsibility for danielle in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-02-27","commitResults":[{"hash":"e281017408e45ad12043f7bd2f4f2ebf7cb31266","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n Update AboutUs.md\n fix: add correctly named png file for danielle loh to docs\n fix: delete wrongly formatted png file for danielle loh\n fix: naming issue in images.\n Update AboutUs.md\n Update AboutUs.md for Johan\n Update `AboutUs.md`\n fix: edit role and responsibility for danielle in AboutUs.md\n docs: fix typo\n Upload profile picture\n docs: update danielle\u0027s section in aboutus.md\n docs: add section for danielle loh\n docs: add section for leng khai\n","fileTypesAndContributionMap":{}},{"hash":"767befcf7293cba60b3fa513a0aa66f579936f65","isMergeCommit":false,"messageTitle":"update UserGuide.md to include feature of exporting data to csv.","messageBody":"Users will refer to the instructions under this section of the user\nguide to figure out how to export the data in ab3 to a csv file.\n\nadd,\n* command format used to export data to csv\n* information on what action is performed after command is input\n* command format and information in command summary table\n","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":9}}},{"hash":"134c8bf22b0a36470a18b560e66ab94893a84d89","isMergeCommit":false,"messageTitle":"Update user guide to include information about contact\u0027s email addresses being unique","messageBody":"No two contacts in should have the same email addresses and the email\naddresses can be used to uniquely identify each contact.\n\nadd a box labelled important under \"Adding a person\" section to inform\nusers of this feature\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":1}}},{"hash":"cc731666fa7731670dfb2e1f3b499fbafb360e66","isMergeCommit":false,"messageTitle":"fix: table formatting in user guide for command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"03cebf6fc95f2e17ed135a1f86b6242bf3cbfe3f","isMergeCommit":false,"messageTitle":"fix: table formatting in user guide for command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"f9d1f1ae5c6b26f507b4596b3d1f83737feb065d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n Update User Guide\n","fileTypesAndContributionMap":{}},{"hash":"52bd05ea07a9cf4cda5ab39e0eb74ef8875ff2a6","isMergeCommit":true,"messageTitle":"fix: merge conflicts with main for user guide command summary table","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"eafc5e9d85dd76a85459623ea9d21f2b67e760cb","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-UserGuide\u0027 of https://github.com/danielleloh/tp into branch-UserGuide","messageBody":"* \u0027branch-UserGuide\u0027 of https://github.com/danielleloh/tp:\n","fileTypesAndContributionMap":{}},{"hash":"b214360ba4355037c17f537a75f15e0ffbe79030","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp into branch-UserGuide","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n fix: typo in user guide\n docs: update user guide to support additional parameter\n docs: insert the base information into the docs.\n feat: test adding of prefix constant.\n Update user guide\n Update UserGuide.md\n docs: add list of valid tags to user guide as well as add mention of matriculation id tag.\n Update UserGuide\n","fileTypesAndContributionMap":{}},{"hash":"b992443ff92f9783a603515c9a4f3eee08535a9c","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-UserGuide\u0027","messageBody":"* branch-UserGuide:\n fix: typo in user guide\n docs: update user guide to support additional parameter\n docs: insert the base information into the docs.\n fix: table formatting in user guide for command summary\n fix: table formatting in user guide for command summary\n feat: test adding of prefix constant.\n Update user guide\n Update UserGuide.md\n Update user guide to include information about contact\u0027s email addresses being unique\n update UserGuide.md to include feature of exporting data to csv.\n docs: add list of valid tags to user guide as well as add mention of matriculation id tag.\n Update UserGuide\n","fileTypesAndContributionMap":{}},{"hash":"ab8a2f2779c383a7f7cf0e407e4015b33618b1d0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n README.md contains information of the addressbook from the original fork\n Update UserGuide.md\n Update UserGuide.md\n Update UserGuide.md\n Update UserGuide.md\n","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"e54399ecf22ea04276ca7d26552273969738014a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n docs: retain naming of Person objects.\n docs: retain naming of Person objects.\n docs: elaborate that address book has confirmed the clearance.\n docs: change terminology to \"contact\" instead of using \"person\" interchangeably.\n docs: specify correct numbering and loops for use cases\n fix: error handling for use cases\n docs: improve phrasing of developer guide to fit more closely with functionalities.\n","fileTypesAndContributionMap":{}},{"hash":"f3c6be1f82edfe0c7869f88aee5b00460ec5bd06","isMergeCommit":false,"messageTitle":"update developer guide","messageBody":"edited,\n* improved formatting\n* rephrased vaguely phrased statements to be more specific\n* add unique identification for each use case for easier cross reference\n* use case for exporting of data to a csv file\n","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":28}}},{"hash":"26bdcc8c81a4a73de48334febedf0deb30e6cbe3","isMergeCommit":false,"messageTitle":"Update user guide to include extension on UC03 — add a contact.","messageBody":"Our AddressBook disallows adding of new contacts with existing email\naddresses. Hence, an error message is displayed when users try to add\na contact with an existing email address.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":0}}}]},{"date":"2024-03-01","commitResults":[{"hash":"7a3068ba23f88fe1bff7e031fac4162f7de0a75f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n Update Developer Guide\n Update user guide to include extension on UC03 — add a contact.\n update developer guide\n Update Developer Guide\n Update Developer Guide\n docs: update ui mockup of app.\n","fileTypesAndContributionMap":{}},{"hash":"828df2dc8c4eb01c1bb644d0787278d94c62e747","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-DeveloperGuide","messageBody":"* master:\n Update Developer Guide\n Update Developer Guide\n Update Developer Guide\n docs: update ui mockup of app.\n","fileTypesAndContributionMap":{}},{"hash":"6d983d37796f35ff48cd0dc28a0b946bf5436488","isMergeCommit":false,"messageTitle":"Update developer guide\u0027s formatting","messageBody":"Ensuring that the phrasing and formatting of the developer guide is\nconsistent throughout makes it look more professional\n\nchanges made include,\n* formatting of the naming and unique identification of use cases\n* add appropriate punctuation to places to ensure consistent formatting\n","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]}],"delishad21":[{"date":"2024-02-26","commitResults":[{"hash":"6552ccac14e920f46d85b48bf5934aea5297204a","isMergeCommit":true,"messageTitle":"Merge pull request #51 from jayllo-c/branch_UpdateAboutUs","messageBody":"Update Aboutus","fileTypesAndContributionMap":{}},{"hash":"9378ca667aa5ccb8061a59fcd21db1c64bf92709","isMergeCommit":false,"messageTitle":"Update AboutUs.md for Johan","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":12}}},{"hash":"0f57771296a32263b8b755a170839e8b9f25f55a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch_update_aboutUs","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"d6202ed3bb60290e4eef58086ba038ca40bd16e3","isMergeCommit":false,"messageTitle":"Update User Guide","messageBody":"Users have to stay updated on the changes in features of the app to utilise it properly\n\nUpdate specifications for \"find\" command to accomodate new features\n","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":12}}},{"hash":"a22ff8b800c7ffb07a0481abb4476756b8ae9bb0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UserGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"33898897ddf5bba0bfbee4aa335d6072dc906f09","isMergeCommit":false,"messageTitle":"README.md contains information of the addressbook from the original fork","messageBody":"An update has to be made to the README.md to align it with the app we are developing\n\nLet\u0027s change the README file to include information for our application\n","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":14}}}]},{"date":"2024-02-28","commitResults":[{"hash":"2f0471857555af30e6a65554e81ca57afac9c794","isMergeCommit":true,"messageTitle":"Merge pull request #118 from Zer0Legion/branch-elaborate-dg-usecases","messageBody":"docs: improve phrasing of developer guide","fileTypesAndContributionMap":{}},{"hash":"b52bec718ad3971961cb14ba1f3fac87381053fa","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateDg","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"dac7e73ebce50fdebf4fefede32eeb11925ec1b7","isMergeCommit":true,"messageTitle":"Merge pull request #119 from Zer0Legion/branch-ui-png","messageBody":"docs: update ui mockup of app.","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"2ed4a84c126d18f9e9dc5f63dc2ba3648c2b8c95","isMergeCommit":false,"messageTitle":"Improve explaination for prefixes and find command in User Guide","messageBody":"There is an overlapping usage for the term \"parameter\" which currently refers to both the prefixes \"e/, n/, etc.\" which can cause confusion for users. The instructions for the find command are particularly confusing as it requires dynamic usage of prefixes.\n\nLet\u0027s update the user guide to be clearer in explaining the usage of prefixes and parameters.\n","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":45}}},{"hash":"0de7bb34778749b0120830398067f13f9e2bed20","isMergeCommit":false,"messageTitle":"Change usage of terminologies to be consistent with code Contact -\u003e Person","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":116,"deletions":116}}}]}],"Pughal77":[{"date":"2024-02-26","commitResults":[{"hash":"2e172c2901f5d16778d96a496e410b26fb69b08c","isMergeCommit":false,"messageTitle":"Update `AboutUs.md`","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"cefedf508a4c8f097c05fc7d781ebbd7d65d7d15","isMergeCommit":true,"messageTitle":"Merge pull request #62 from Zer0Legion/master","messageBody":"Update AboutUs.md for Leng Khai","fileTypesAndContributionMap":{}},{"hash":"d6fc481becfa7b03caa861657dce591ee98aabed","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d2cdfba8dfb327fb98a03011753288fd786b7ac6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-27","commitResults":[{"hash":"af6a3c0159082f31bda65ec1308a9b4943ebedf1","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"78cd705ca455b25d043ffc502d2f1cce4bb1c660","isMergeCommit":true,"messageTitle":"Merge pull request #105 from jayllo-c/branch-UpdateUg","messageBody":"Update User Guide to include mass email copying feature v1.1","fileTypesAndContributionMap":{}},{"hash":"61a7e468579eeba6065b86d838ccc54952ce472c","isMergeCommit":true,"messageTitle":"Merge pull request #110 from Zer0Legion/branch-dg-base-info","messageBody":"Update DeveloperGuide.md: insert the base information into the docs.","fileTypesAndContributionMap":{}},{"hash":"d31c548ededa4c95685c54f295e8d7372fbdd960","isMergeCommit":true,"messageTitle":"Merge pull request #111 from Zer0Legion/branch-ug-matric-number-param","messageBody":"docs: update user guide to support additional parameter","fileTypesAndContributionMap":{}},{"hash":"2017baa3e3ca8b497f6add50a3bbe6dc40292c21","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-ug-fix-typo-parameter","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a5f5bfcea96e11bc9501ebb75cc0563cfdb258c7","isMergeCommit":true,"messageTitle":"Merge pull request #112 from Zer0Legion/branch-ug-fix-typo-parameter","messageBody":"fix typo in UG","fileTypesAndContributionMap":{}},{"hash":"e58440019bc508282a85b6f8a9cf15698384d9ea","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UserGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"4499edb5ea8fc6ad0f21d75743bd78dc69a0250e","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Add a new command `import` that includes feature to import contacts from a csv file\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"a957bff6ae1ec0a5c08d2b72cd64b480edf8216d","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"eda732e2fe7bc7625729ba43317e7042c1fbe154","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fb39d46ced19f383d00000e52da604624f3c0cc1","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Update Command Summary table\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":13}}}]},{"date":"2024-02-29","commitResults":[{"hash":"6d2402c1a29c034cc67fb96c7292c5ccc3e0dc87","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"The developer guide now includes the use case of importing files\n","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":0}}}]},{"date":"2024-03-03","commitResults":[{"hash":"d2ca84ae90593698fe252c6260bc0d05a7a1b870","isMergeCommit":true,"messageTitle":"Merge pull request #129 from delishad21/update_UserGuide","messageBody":"Improve explaination for prefixes and find command in User Guide","fileTypesAndContributionMap":{}}]}],"Zer0Legion":[{"date":"2024-02-26","commitResults":[{"hash":"faca0fc3a2d2ddda5ac39ff606ea4055bc54cda1","isMergeCommit":false,"messageTitle":"docs: add section for leng khai","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"bfe66ec26679acb4dd1a3b50a1500e4e7bd99aec","isMergeCommit":false,"messageTitle":"docs: fix typo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b83c48adf13635c26e852dc46d396ebd15324f03","isMergeCommit":true,"messageTitle":"Merge pull request #60 from jayllo-c/branch_UpdateAboutUs","messageBody":"Update AboutUs.md for James Castillo","fileTypesAndContributionMap":{}},{"hash":"008571485ddf19ebad537a3572ec0308f1d62e8d","isMergeCommit":false,"messageTitle":"fix: naming issue in images.","messageBody":"This allows myself to get graded correctly.\n\nLets strive not to make any more mistakes in the future.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-27","commitResults":[{"hash":"bd9399ddd11a901cf96ab8501a5cf56e1d8b2174","isMergeCommit":false,"messageTitle":"docs: add list of valid tags to user guide as well as add mention of matriculation id tag.","messageBody":"This ensures users are kept up to date of new features that are\ngoing to be implemented.\n\nLets all strive to write better documentation for users.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":8}}},{"hash":"46591b29bb3df79733e798146be301d4d61ed611","isMergeCommit":true,"messageTitle":"Merge pull request #107 from delishad21/branch_update_UserGuide","messageBody":"Update User Guide","fileTypesAndContributionMap":{}},{"hash":"225282d7fdf946a4ead6ca00373fd007125a6792","isMergeCommit":false,"messageTitle":"feat: test adding of prefix constant.","messageBody":"This enables me to trace the command and required usages of\nthe new parameter.\n\nLets have a good time to trace the code.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":0}}},{"hash":"e3ba7edc4b4e7289a4b09dc3e6a1b9a6fca2649c","isMergeCommit":false,"messageTitle":"docs: insert the base information into the docs.","messageBody":"This allows developers to keep up to date and have our information\nin one place.\n\nLets improve documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":177,"deletions":34}}},{"hash":"7a59b0182ab6aaeeccf90da3fd5589f07a0c84b4","isMergeCommit":false,"messageTitle":"docs: update user guide to support additional parameter","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"fe560dbbc6520a5c3ecdd4a9374c45700e81a5c6","isMergeCommit":false,"messageTitle":"fix: typo in user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"50bafadb45f30ca7cc4cafd7b93547379c3a9e91","isMergeCommit":true,"messageTitle":"Merge pull request #106 from danielleloh/branch-UserGuide","messageBody":"Update user guide to include instructions on exporting of data to csv","fileTypesAndContributionMap":{}},{"hash":"c7352ea511be46d417643e8b4499e6e84b3cd865","isMergeCommit":false,"messageTitle":"docs: improve phrasing of developer guide to fit more closely with functionalities.","messageBody":"This brings the developer guide closer to the actual implementation\nof the code.\n\nLets strive to improve documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":31}}},{"hash":"d75d9eb6c6214262c7c09412337107fb8bf0feda","isMergeCommit":true,"messageTitle":"Merge pull request #116 from Pughal77/branch-UpdateUserGuide.md-ImportFeature","messageBody":"Branch update user guide.md import feature","fileTypesAndContributionMap":{}},{"hash":"d31a9991d9d9d88d90bb9ded5409470341cfd187","isMergeCommit":true,"messageTitle":"Merge pull request #117 from delishad21/branch_UpdateDeveloperGuide","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"ff3d2a852a5e2f83f6539fa0144fca87644f62f1","isMergeCommit":false,"messageTitle":"fix: error handling for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-02-28","commitResults":[{"hash":"a81d8cb89ad8685c023d0955e8ad033c908fe11f","isMergeCommit":false,"messageTitle":"docs: specify correct numbering and loops for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3440b941851c9a3c28fd69401564aad65c79a265","isMergeCommit":false,"messageTitle":"docs: change terminology to \"contact\" instead of using \"person\" interchangeably.","messageBody":"Now, ambiguity is removed where we are adding contacts in the\naddress book instead of persons.\n\nLets strive to remove ambiguity.\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":53}}},{"hash":"f45b9173899bab56e8d98e599dbabdb7e5dacec5","isMergeCommit":false,"messageTitle":"docs: elaborate that address book has confirmed the clearance.","messageBody":"Now the use case more accurately reflects the interaction with\nthe user.\n\nLets strive towards better documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"c213d8795b3b8149c4142833a530c69beb0c3619","isMergeCommit":false,"messageTitle":"docs: retain naming of Person objects.","messageBody":"This keeps the classes names intact.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"d94e39d85b0c0be97bbf68b621a515a15efc8a12","isMergeCommit":false,"messageTitle":"docs: retain naming of Person objects.","messageBody":"This keeps the classes names intact.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"2e27426c70c1b9f5d39410dc5695c3692e1c4a68","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-elaborate-dg-usecases\u0027 of https://github.com/Zer0Legion/tp into branch-elaborate-dg-usecases","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"697796419f6caceb190fa7ce8ec8cd3a17c94f38","isMergeCommit":true,"messageTitle":"Merge pull request #121 from jayllo-c/branch-UpdateDg","messageBody":"Update Developer Guide to include use cases for copying email addresses v1.1","fileTypesAndContributionMap":{}},{"hash":"6c97a05db2fbc8fd1c7a72ed5629ba5b1001762e","isMergeCommit":true,"messageTitle":"Merge pull request #123 from danielleloh/branch-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}},{"hash":"6ab5a371d30f77bcf93a54b975021f58b1a48ace","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateDeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"34d8df411f6f8a8a270a15a5a2a9e85976744814","isMergeCommit":true,"messageTitle":"Merge pull request #125 from Pughal77/branch-UpdateDeveloperGuide.md","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"b48b7b2026f452e257f9956d2ddb2a3f90fd24c6","isMergeCommit":true,"messageTitle":"Merge pull request #126 from danielleloh/branch-DeveloperGuide","messageBody":"Update formatting of developer guide","fileTypesAndContributionMap":{}}]}],"jayllo-c":[{"date":"2024-02-26","commitResults":[{"hash":"5138082c90c1117c7f50d7ea77d8805e40528718","isMergeCommit":false,"messageTitle":"Update Aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":14}}},{"hash":"0365a2654a5b3be9156fa968524115f2ce6dcafa","isMergeCommit":false,"messageTitle":"Upload profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"48817ef600ba6624bfab8a5e252810d492f3d09a","isMergeCommit":true,"messageTitle":"Merge pull request #63 from danielleloh/branch-AboutUs","messageBody":"Update AboutUs.md for Danielle","fileTypesAndContributionMap":{}},{"hash":"03373db2cf183a5e19278a1a05ee7465d4d384b9","isMergeCommit":true,"messageTitle":"Merge pull request #69 from danielleloh/branch-AboutUs","messageBody":"fix: rename png file for Danielle ","fileTypesAndContributionMap":{}},{"hash":"0f12365fbafa87c8fba055f9c6d32cf4c50a09b5","isMergeCommit":true,"messageTitle":"Merge pull request #64 from Pughal77/branch-UpdateAboutUs.md","messageBody":"Update Pughal\u0027s section for `AboutUs.md`","fileTypesAndContributionMap":{}},{"hash":"72276db1744e676dcabca4858c5f9de973fa69bb","isMergeCommit":true,"messageTitle":"Merge pull request #67 from Zer0Legion/branch-fix-aboutus","messageBody":"fix: naming issue in images.","fileTypesAndContributionMap":{}},{"hash":"5c1e47a7f21b4394e2e76203535c05ee214e200e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch_update_aboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9711e39af6116923444f455d7e21bebdd7a175d3","isMergeCommit":true,"messageTitle":"Merge pull request #65 from delishad21/branch_update_aboutUs","messageBody":"Update AboutUs.md for Johan","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"61fe3a5b0f0691476cdca5e74a3f20f32bf93fab","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch_UpdateAboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"00605d6b13b7887f90159df1582daa722e6c40be","isMergeCommit":false,"messageTitle":"Update UserGuide","messageBody":"Updated the user guide to include the mass email copying feature.\n\nThis update ensures that the user guide is up-to-date with the planned\nfeatures.\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"0efee1409e69e3a0891ae1391eb6cd6876058696","isMergeCommit":false,"messageTitle":"Update user guide","messageBody":"Minor change was made to the command summary to include the \u0027copy\u0027\ncommand.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"00b7773d4ea2b1b4ff13bbf2c7fc4d864715fdbd","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateUg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a961d6c0e879fb0e3d63d5e05a7cbec3ae8ce21f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp into branch-UpdateUg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3ab8c7884d2026d127d480d7d53d2eb65d32ea13","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-UpdateUg\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"35529d9b591119fda457c6a29d2714458d4fc11f","isMergeCommit":true,"messageTitle":"Merge pull request #109 from Pughal77/branch-UpdateUserGuide.md","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"e1024525c4d5606814292f1fa5469648e257d8d5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-ug-matric-number-param","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2bc6eaa20c47fc01591909f28b47da0430cec841","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"ce1bc2bed13978a83568ef9c7f21a44079cc2ff0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"68ac402bdae57ce185bbda0ec381a0fc9dc87433","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Developer guide updated to include use cases for copying of emails.\n\nThis allows future developers to better understand how the \u0027copy\u0027\nfunction interacts with users.\n","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":3}}},{"hash":"65a6b45555f00b6711aa4e97742b34a5310d0ea1","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Changed phrasing to align with common terminologies agreed by the team.\n\nThis ensures the developer guide is standardized.\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"danielleloh":{"docs":47,"functional-code":0,"test-code":0},"delishad21":{"docs":114,"functional-code":0,"test-code":0},"Pughal77":{"docs":40,"functional-code":0,"test-code":0},"Zer0Legion":{"docs":141,"functional-code":4,"test-code":0},"jayllo-c":{"docs":23,"functional-code":0,"test-code":0}},"authorContributionVariance":{"danielleloh":803.69,"delishad21":9348.89,"Pughal77":268.75998,"Zer0Legion":10960.041,"jayllo-c":208.43999},"authorDisplayNameMap":{"danielleloh":"CS2103T-T10-1 LOH ..ELLE","delishad21":"CS2103T-T10-1 JOHA.. SOO","Pughal77":"CS2103T-T10-1 T PU.. RAJ","Zer0Legion":"CS2103T-T10-1 ANG ..KHAI","jayllo-c":"CS2103T-T10-1 CAST..ABOY"}} +{"authorDailyContributionsMap":{"danielleloh":[{"date":"2024-02-26","commitResults":[{"hash":"ed9d7c2c6e65d06203e8fc38567274da14cf63db","isMergeCommit":false,"messageTitle":"docs: add section for danielle loh","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"e5172e2189b97411d0db519415034fd5e4f569e6","isMergeCommit":false,"messageTitle":"docs: update danielle\u0027s section in aboutus.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c52ea3fa49a29780868d547cb0f12a27d9673265","isMergeCommit":false,"messageTitle":"fix: edit role and responsibility for danielle in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-02-27","commitResults":[{"hash":"e281017408e45ad12043f7bd2f4f2ebf7cb31266","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n Update AboutUs.md\n fix: add correctly named png file for danielle loh to docs\n fix: delete wrongly formatted png file for danielle loh\n fix: naming issue in images.\n Update AboutUs.md\n Update AboutUs.md for Johan\n Update `AboutUs.md`\n fix: edit role and responsibility for danielle in AboutUs.md\n docs: fix typo\n Upload profile picture\n docs: update danielle\u0027s section in aboutus.md\n docs: add section for danielle loh\n docs: add section for leng khai\n","fileTypesAndContributionMap":{}},{"hash":"767befcf7293cba60b3fa513a0aa66f579936f65","isMergeCommit":false,"messageTitle":"update UserGuide.md to include feature of exporting data to csv.","messageBody":"Users will refer to the instructions under this section of the user\nguide to figure out how to export the data in ab3 to a csv file.\n\nadd,\n* command format used to export data to csv\n* information on what action is performed after command is input\n* command format and information in command summary table\n","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":9}}},{"hash":"134c8bf22b0a36470a18b560e66ab94893a84d89","isMergeCommit":false,"messageTitle":"Update user guide to include information about contact\u0027s email addresses being unique","messageBody":"No two contacts in should have the same email addresses and the email\naddresses can be used to uniquely identify each contact.\n\nadd a box labelled important under \"Adding a person\" section to inform\nusers of this feature\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":1}}},{"hash":"cc731666fa7731670dfb2e1f3b499fbafb360e66","isMergeCommit":false,"messageTitle":"fix: table formatting in user guide for command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"03cebf6fc95f2e17ed135a1f86b6242bf3cbfe3f","isMergeCommit":false,"messageTitle":"fix: table formatting in user guide for command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"f9d1f1ae5c6b26f507b4596b3d1f83737feb065d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n Update User Guide\n","fileTypesAndContributionMap":{}},{"hash":"52bd05ea07a9cf4cda5ab39e0eb74ef8875ff2a6","isMergeCommit":true,"messageTitle":"fix: merge conflicts with main for user guide command summary table","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"eafc5e9d85dd76a85459623ea9d21f2b67e760cb","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-UserGuide\u0027 of https://github.com/danielleloh/tp into branch-UserGuide","messageBody":"* \u0027branch-UserGuide\u0027 of https://github.com/danielleloh/tp:\n","fileTypesAndContributionMap":{}},{"hash":"b214360ba4355037c17f537a75f15e0ffbe79030","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp into branch-UserGuide","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n fix: typo in user guide\n docs: update user guide to support additional parameter\n docs: insert the base information into the docs.\n feat: test adding of prefix constant.\n Update user guide\n Update UserGuide.md\n docs: add list of valid tags to user guide as well as add mention of matriculation id tag.\n Update UserGuide\n","fileTypesAndContributionMap":{}},{"hash":"b992443ff92f9783a603515c9a4f3eee08535a9c","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-UserGuide\u0027","messageBody":"* branch-UserGuide:\n fix: typo in user guide\n docs: update user guide to support additional parameter\n docs: insert the base information into the docs.\n fix: table formatting in user guide for command summary\n fix: table formatting in user guide for command summary\n feat: test adding of prefix constant.\n Update user guide\n Update UserGuide.md\n Update user guide to include information about contact\u0027s email addresses being unique\n update UserGuide.md to include feature of exporting data to csv.\n docs: add list of valid tags to user guide as well as add mention of matriculation id tag.\n Update UserGuide\n","fileTypesAndContributionMap":{}},{"hash":"ab8a2f2779c383a7f7cf0e407e4015b33618b1d0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n README.md contains information of the addressbook from the original fork\n Update UserGuide.md\n Update UserGuide.md\n Update UserGuide.md\n Update UserGuide.md\n","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"e54399ecf22ea04276ca7d26552273969738014a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n docs: retain naming of Person objects.\n docs: retain naming of Person objects.\n docs: elaborate that address book has confirmed the clearance.\n docs: change terminology to \"contact\" instead of using \"person\" interchangeably.\n docs: specify correct numbering and loops for use cases\n fix: error handling for use cases\n docs: improve phrasing of developer guide to fit more closely with functionalities.\n","fileTypesAndContributionMap":{}},{"hash":"f3c6be1f82edfe0c7869f88aee5b00460ec5bd06","isMergeCommit":false,"messageTitle":"update developer guide","messageBody":"edited,\n* improved formatting\n* rephrased vaguely phrased statements to be more specific\n* add unique identification for each use case for easier cross reference\n* use case for exporting of data to a csv file\n","fileTypesAndContributionMap":{"docs":{"insertions":39,"deletions":28}}},{"hash":"26bdcc8c81a4a73de48334febedf0deb30e6cbe3","isMergeCommit":false,"messageTitle":"Update user guide to include extension on UC03 — add a contact.","messageBody":"Our AddressBook disallows adding of new contacts with existing email\naddresses. Hence, an error message is displayed when users try to add\na contact with an existing email address.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":0}}}]},{"date":"2024-03-01","commitResults":[{"hash":"7a3068ba23f88fe1bff7e031fac4162f7de0a75f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp:\n Update Developer Guide\n Update user guide to include extension on UC03 — add a contact.\n update developer guide\n Update Developer Guide\n Update Developer Guide\n docs: update ui mockup of app.\n","fileTypesAndContributionMap":{}},{"hash":"828df2dc8c4eb01c1bb644d0787278d94c62e747","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-DeveloperGuide","messageBody":"* master:\n Update Developer Guide\n Update Developer Guide\n Update Developer Guide\n docs: update ui mockup of app.\n","fileTypesAndContributionMap":{}},{"hash":"6d983d37796f35ff48cd0dc28a0b946bf5436488","isMergeCommit":false,"messageTitle":"Update developer guide\u0027s formatting","messageBody":"Ensuring that the phrasing and formatting of the developer guide is\nconsistent throughout makes it look more professional\n\nchanges made include,\n* formatting of the naming and unique identification of use cases\n* add appropriate punctuation to places to ensure consistent formatting\n","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]}],"delishad21":[{"date":"2024-02-26","commitResults":[{"hash":"6552ccac14e920f46d85b48bf5934aea5297204a","isMergeCommit":true,"messageTitle":"Merge pull request #51 from jayllo-c/branch_UpdateAboutUs","messageBody":"Update Aboutus","fileTypesAndContributionMap":{}},{"hash":"9378ca667aa5ccb8061a59fcd21db1c64bf92709","isMergeCommit":false,"messageTitle":"Update AboutUs.md for Johan","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":12}}},{"hash":"0f57771296a32263b8b755a170839e8b9f25f55a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch_update_aboutUs","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"d6202ed3bb60290e4eef58086ba038ca40bd16e3","isMergeCommit":false,"messageTitle":"Update User Guide","messageBody":"Users have to stay updated on the changes in features of the app to utilise it properly\n\nUpdate specifications for \"find\" command to accomodate new features\n","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":12}}},{"hash":"a22ff8b800c7ffb07a0481abb4476756b8ae9bb0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UserGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"33898897ddf5bba0bfbee4aa335d6072dc906f09","isMergeCommit":false,"messageTitle":"README.md contains information of the addressbook from the original fork","messageBody":"An update has to be made to the README.md to align it with the app we are developing\n\nLet\u0027s change the README file to include information for our application\n","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":14}}}]},{"date":"2024-02-28","commitResults":[{"hash":"2f0471857555af30e6a65554e81ca57afac9c794","isMergeCommit":true,"messageTitle":"Merge pull request #118 from Zer0Legion/branch-elaborate-dg-usecases","messageBody":"docs: improve phrasing of developer guide","fileTypesAndContributionMap":{}},{"hash":"b52bec718ad3971961cb14ba1f3fac87381053fa","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateDg","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"dac7e73ebce50fdebf4fefede32eeb11925ec1b7","isMergeCommit":true,"messageTitle":"Merge pull request #119 from Zer0Legion/branch-ui-png","messageBody":"docs: update ui mockup of app.","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"2ed4a84c126d18f9e9dc5f63dc2ba3648c2b8c95","isMergeCommit":false,"messageTitle":"Improve explaination for prefixes and find command in User Guide","messageBody":"There is an overlapping usage for the term \"parameter\" which currently refers to both the prefixes \"e/, n/, etc.\" which can cause confusion for users. The instructions for the find command are particularly confusing as it requires dynamic usage of prefixes.\n\nLet\u0027s update the user guide to be clearer in explaining the usage of prefixes and parameters.\n","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":45}}},{"hash":"0de7bb34778749b0120830398067f13f9e2bed20","isMergeCommit":false,"messageTitle":"Change usage of terminologies to be consistent with code Contact -\u003e Person","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":116,"deletions":116}}}]}],"Pughal77":[{"date":"2024-02-26","commitResults":[{"hash":"2e172c2901f5d16778d96a496e410b26fb69b08c","isMergeCommit":false,"messageTitle":"Update `AboutUs.md`","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"cefedf508a4c8f097c05fc7d781ebbd7d65d7d15","isMergeCommit":true,"messageTitle":"Merge pull request #62 from Zer0Legion/master","messageBody":"Update AboutUs.md for Leng Khai","fileTypesAndContributionMap":{}},{"hash":"d6fc481becfa7b03caa861657dce591ee98aabed","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d2cdfba8dfb327fb98a03011753288fd786b7ac6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-27","commitResults":[{"hash":"af6a3c0159082f31bda65ec1308a9b4943ebedf1","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"78cd705ca455b25d043ffc502d2f1cce4bb1c660","isMergeCommit":true,"messageTitle":"Merge pull request #105 from jayllo-c/branch-UpdateUg","messageBody":"Update User Guide to include mass email copying feature v1.1","fileTypesAndContributionMap":{}},{"hash":"61a7e468579eeba6065b86d838ccc54952ce472c","isMergeCommit":true,"messageTitle":"Merge pull request #110 from Zer0Legion/branch-dg-base-info","messageBody":"Update DeveloperGuide.md: insert the base information into the docs.","fileTypesAndContributionMap":{}},{"hash":"d31c548ededa4c95685c54f295e8d7372fbdd960","isMergeCommit":true,"messageTitle":"Merge pull request #111 from Zer0Legion/branch-ug-matric-number-param","messageBody":"docs: update user guide to support additional parameter","fileTypesAndContributionMap":{}},{"hash":"2017baa3e3ca8b497f6add50a3bbe6dc40292c21","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-ug-fix-typo-parameter","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a5f5bfcea96e11bc9501ebb75cc0563cfdb258c7","isMergeCommit":true,"messageTitle":"Merge pull request #112 from Zer0Legion/branch-ug-fix-typo-parameter","messageBody":"fix typo in UG","fileTypesAndContributionMap":{}},{"hash":"e58440019bc508282a85b6f8a9cf15698384d9ea","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UserGuide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"4499edb5ea8fc6ad0f21d75743bd78dc69a0250e","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Add a new command `import` that includes feature to import contacts from a csv file\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"a957bff6ae1ec0a5c08d2b72cd64b480edf8216d","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"eda732e2fe7bc7625729ba43317e7042c1fbe154","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fb39d46ced19f383d00000e52da604624f3c0cc1","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"Update Command Summary table\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":13}}}]},{"date":"2024-02-29","commitResults":[{"hash":"6d2402c1a29c034cc67fb96c7292c5ccc3e0dc87","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"The developer guide now includes the use case of importing files\n","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":0}}}]},{"date":"2024-03-03","commitResults":[{"hash":"d2ca84ae90593698fe252c6260bc0d05a7a1b870","isMergeCommit":true,"messageTitle":"Merge pull request #129 from delishad21/update_UserGuide","messageBody":"Improve explaination for prefixes and find command in User Guide","fileTypesAndContributionMap":{}}]}],"Zer0Legion":[{"date":"2024-02-26","commitResults":[{"hash":"faca0fc3a2d2ddda5ac39ff606ea4055bc54cda1","isMergeCommit":false,"messageTitle":"docs: add section for leng khai","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"bfe66ec26679acb4dd1a3b50a1500e4e7bd99aec","isMergeCommit":false,"messageTitle":"docs: fix typo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b83c48adf13635c26e852dc46d396ebd15324f03","isMergeCommit":true,"messageTitle":"Merge pull request #60 from jayllo-c/branch_UpdateAboutUs","messageBody":"Update AboutUs.md for James Castillo","fileTypesAndContributionMap":{}},{"hash":"008571485ddf19ebad537a3572ec0308f1d62e8d","isMergeCommit":false,"messageTitle":"fix: naming issue in images.","messageBody":"This allows myself to get graded correctly.\n\nLets strive not to make any more mistakes in the future.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-27","commitResults":[{"hash":"bd9399ddd11a901cf96ab8501a5cf56e1d8b2174","isMergeCommit":false,"messageTitle":"docs: add list of valid tags to user guide as well as add mention of matriculation id tag.","messageBody":"This ensures users are kept up to date of new features that are\ngoing to be implemented.\n\nLets all strive to write better documentation for users.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":8}}},{"hash":"46591b29bb3df79733e798146be301d4d61ed611","isMergeCommit":true,"messageTitle":"Merge pull request #107 from delishad21/branch_update_UserGuide","messageBody":"Update User Guide","fileTypesAndContributionMap":{}},{"hash":"225282d7fdf946a4ead6ca00373fd007125a6792","isMergeCommit":false,"messageTitle":"feat: test adding of prefix constant.","messageBody":"This enables me to trace the command and required usages of\nthe new parameter.\n\nLets have a good time to trace the code.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":0}}},{"hash":"e3ba7edc4b4e7289a4b09dc3e6a1b9a6fca2649c","isMergeCommit":false,"messageTitle":"docs: insert the base information into the docs.","messageBody":"This allows developers to keep up to date and have our information\nin one place.\n\nLets improve documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":177,"deletions":34}}},{"hash":"7a59b0182ab6aaeeccf90da3fd5589f07a0c84b4","isMergeCommit":false,"messageTitle":"docs: update user guide to support additional parameter","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":4}}},{"hash":"fe560dbbc6520a5c3ecdd4a9374c45700e81a5c6","isMergeCommit":false,"messageTitle":"fix: typo in user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"50bafadb45f30ca7cc4cafd7b93547379c3a9e91","isMergeCommit":true,"messageTitle":"Merge pull request #106 from danielleloh/branch-UserGuide","messageBody":"Update user guide to include instructions on exporting of data to csv","fileTypesAndContributionMap":{}},{"hash":"c7352ea511be46d417643e8b4499e6e84b3cd865","isMergeCommit":false,"messageTitle":"docs: improve phrasing of developer guide to fit more closely with functionalities.","messageBody":"This brings the developer guide closer to the actual implementation\nof the code.\n\nLets strive to improve documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":31}}},{"hash":"d75d9eb6c6214262c7c09412337107fb8bf0feda","isMergeCommit":true,"messageTitle":"Merge pull request #116 from Pughal77/branch-UpdateUserGuide.md-ImportFeature","messageBody":"Branch update user guide.md import feature","fileTypesAndContributionMap":{}},{"hash":"d31a9991d9d9d88d90bb9ded5409470341cfd187","isMergeCommit":true,"messageTitle":"Merge pull request #117 from delishad21/branch_UpdateDeveloperGuide","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"ff3d2a852a5e2f83f6539fa0144fca87644f62f1","isMergeCommit":false,"messageTitle":"fix: error handling for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-02-28","commitResults":[{"hash":"a81d8cb89ad8685c023d0955e8ad033c908fe11f","isMergeCommit":false,"messageTitle":"docs: specify correct numbering and loops for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3440b941851c9a3c28fd69401564aad65c79a265","isMergeCommit":false,"messageTitle":"docs: change terminology to \"contact\" instead of using \"person\" interchangeably.","messageBody":"Now, ambiguity is removed where we are adding contacts in the\naddress book instead of persons.\n\nLets strive to remove ambiguity.\n","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":53}}},{"hash":"f45b9173899bab56e8d98e599dbabdb7e5dacec5","isMergeCommit":false,"messageTitle":"docs: elaborate that address book has confirmed the clearance.","messageBody":"Now the use case more accurately reflects the interaction with\nthe user.\n\nLets strive towards better documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"c213d8795b3b8149c4142833a530c69beb0c3619","isMergeCommit":false,"messageTitle":"docs: retain naming of Person objects.","messageBody":"This keeps the classes names intact.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"d94e39d85b0c0be97bbf68b621a515a15efc8a12","isMergeCommit":false,"messageTitle":"docs: retain naming of Person objects.","messageBody":"This keeps the classes names intact.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"2e27426c70c1b9f5d39410dc5695c3692e1c4a68","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-elaborate-dg-usecases\u0027 of https://github.com/Zer0Legion/tp into branch-elaborate-dg-usecases","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}}]},{"date":"2024-03-01","commitResults":[{"hash":"697796419f6caceb190fa7ce8ec8cd3a17c94f38","isMergeCommit":true,"messageTitle":"Merge pull request #121 from jayllo-c/branch-UpdateDg","messageBody":"Update Developer Guide to include use cases for copying email addresses v1.1","fileTypesAndContributionMap":{}},{"hash":"6c97a05db2fbc8fd1c7a72ed5629ba5b1001762e","isMergeCommit":true,"messageTitle":"Merge pull request #123 from danielleloh/branch-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}},{"hash":"6ab5a371d30f77bcf93a54b975021f58b1a48ace","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateDeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"34d8df411f6f8a8a270a15a5a2a9e85976744814","isMergeCommit":true,"messageTitle":"Merge pull request #125 from Pughal77/branch-UpdateDeveloperGuide.md","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"b48b7b2026f452e257f9956d2ddb2a3f90fd24c6","isMergeCommit":true,"messageTitle":"Merge pull request #126 from danielleloh/branch-DeveloperGuide","messageBody":"Update formatting of developer guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"44c23429155f073b8a1e4ddff57289388ff98ab1","isMergeCommit":false,"messageTitle":"fix: remove traces of AB3, replace with avengers assemble (AA)","messageBody":"This ensures consistency with our application, now named avengers\nassemble (AA). This removes any ambiguity or confusion by the\nreader.\n\nLets strive toward better documentation\n","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1},"other":{"insertions":1,"deletions":1},"docs":{"insertions":20,"deletions":20},"test-code":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ca981ade1610da27aaf66bc158a58d924742708f","isMergeCommit":true,"messageTitle":"Merge pull request #132 from Zer0Legion/branch-remove-ab3-references","messageBody":"fix: remove traces of AB3, replace with avengers assemble (AA)","fileTypesAndContributionMap":{}}]}],"jayllo-c":[{"date":"2024-02-26","commitResults":[{"hash":"5138082c90c1117c7f50d7ea77d8805e40528718","isMergeCommit":false,"messageTitle":"Update Aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":14}}},{"hash":"0365a2654a5b3be9156fa968524115f2ce6dcafa","isMergeCommit":false,"messageTitle":"Upload profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"48817ef600ba6624bfab8a5e252810d492f3d09a","isMergeCommit":true,"messageTitle":"Merge pull request #63 from danielleloh/branch-AboutUs","messageBody":"Update AboutUs.md for Danielle","fileTypesAndContributionMap":{}},{"hash":"03373db2cf183a5e19278a1a05ee7465d4d384b9","isMergeCommit":true,"messageTitle":"Merge pull request #69 from danielleloh/branch-AboutUs","messageBody":"fix: rename png file for Danielle ","fileTypesAndContributionMap":{}},{"hash":"0f12365fbafa87c8fba055f9c6d32cf4c50a09b5","isMergeCommit":true,"messageTitle":"Merge pull request #64 from Pughal77/branch-UpdateAboutUs.md","messageBody":"Update Pughal\u0027s section for `AboutUs.md`","fileTypesAndContributionMap":{}},{"hash":"72276db1744e676dcabca4858c5f9de973fa69bb","isMergeCommit":true,"messageTitle":"Merge pull request #67 from Zer0Legion/branch-fix-aboutus","messageBody":"fix: naming issue in images.","fileTypesAndContributionMap":{}},{"hash":"5c1e47a7f21b4394e2e76203535c05ee214e200e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch_update_aboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9711e39af6116923444f455d7e21bebdd7a175d3","isMergeCommit":true,"messageTitle":"Merge pull request #65 from delishad21/branch_update_aboutUs","messageBody":"Update AboutUs.md for Johan","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"61fe3a5b0f0691476cdca5e74a3f20f32bf93fab","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch_UpdateAboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"00605d6b13b7887f90159df1582daa722e6c40be","isMergeCommit":false,"messageTitle":"Update UserGuide","messageBody":"Updated the user guide to include the mass email copying feature.\n\nThis update ensures that the user guide is up-to-date with the planned\nfeatures.\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":0}}},{"hash":"0efee1409e69e3a0891ae1391eb6cd6876058696","isMergeCommit":false,"messageTitle":"Update user guide","messageBody":"Minor change was made to the command summary to include the \u0027copy\u0027\ncommand.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"00b7773d4ea2b1b4ff13bbf2c7fc4d864715fdbd","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateUg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a961d6c0e879fb0e3d63d5e05a7cbec3ae8ce21f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp into branch-UpdateUg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3ab8c7884d2026d127d480d7d53d2eb65d32ea13","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-UpdateUg\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"35529d9b591119fda457c6a29d2714458d4fc11f","isMergeCommit":true,"messageTitle":"Merge pull request #109 from Pughal77/branch-UpdateUserGuide.md","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"e1024525c4d5606814292f1fa5469648e257d8d5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-ug-matric-number-param","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2bc6eaa20c47fc01591909f28b47da0430cec841","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"ce1bc2bed13978a83568ef9c7f21a44079cc2ff0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"68ac402bdae57ce185bbda0ec381a0fc9dc87433","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Developer guide updated to include use cases for copying of emails.\n\nThis allows future developers to better understand how the \u0027copy\u0027\nfunction interacts with users.\n","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":3}}},{"hash":"65a6b45555f00b6711aa4e97742b34a5310d0ea1","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"Changed phrasing to align with common terminologies agreed by the team.\n\nThis ensures the developer guide is standardized.\n","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]}]},"authorFileTypeContributionMap":{"danielleloh":{"docs":47,"functional-code":0,"test-code":0},"delishad21":{"docs":111,"functional-code":0,"test-code":0},"Pughal77":{"docs":40,"functional-code":0,"test-code":0},"Zer0Legion":{"docs":161,"functional-code":5,"test-code":2,"other":1},"jayllo-c":{"docs":23,"functional-code":0,"test-code":0}},"authorContributionVariance":{"danielleloh":681.6332,"delishad21":7476.899,"Pughal77":220.48521,"Zer0Legion":8737.608,"jayllo-c":172.8639},"authorDisplayNameMap":{"danielleloh":"CS2103T-T10-1 LOH ..ELLE","delishad21":"CS2103T-T10-1 JOHA.. SOO","Pughal77":"CS2103T-T10-1 T PU.. RAJ","Zer0Legion":"CS2103T-T10-1 ANG ..KHAI","jayllo-c":"CS2103T-T10-1 CAST..ABOY"}} diff --git a/AY2324S2-CS2103T-T12-4_tp_master/authorship.json b/AY2324S2-CS2103T-T12-4_tp_master/authorship.json index 44a24a9a..a4497588 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":"-"},"content":"* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"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 AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"linnn-7":2,"-":11}},{"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":"linnn-7"},"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":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"linnn-7"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"linnn-7"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-28"},{"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: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"ondretann"},"content":"### Ondre Tann","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"ondretann"},"content":"\u003cimg src\u003d\"images/ondretann.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"ondretann"},"content":"[[github](http://github.com/ondretann)]","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: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"PateShin"},"content":"### Shin Dong Yoon","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"PateShin"},"content":"\u003cimg src\u003d\"images/pateshin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"PateShin"},"content":"[[github](https://github.com/PateShin)]","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"linnn-7":6,"PateShin":3,"DhiraPT":4,"-":44,"ondretann":3}},{"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":"-"},"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":"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":" * `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":"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":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":"ondretann"},"content":"* Items with `…`​ after them can be used multiple times at least onxe.\u003cbr\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"ondretann"},"content":" e.g. `[t/TAG]…​` can be used as `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"DhiraPT"},"content":"* Parameters can be in any order, if specified.\u003cbr\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":58,"author":{"gitId":"DhiraPT"},"content":" e.g. if the command specifies `:name :phone`, `:phone :name` is also acceptable.","lastModifiedDate":"2024-02-27"},{"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":"DhiraPT"},"content":"### Adding a new employee: `/new`","lastModifiedDate":"2024-02-27"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"DhiraPT"},"content":"Adds a new employee to the address book.","lastModifiedDate":"2024-02-27"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"DhiraPT"},"content":"Format:","lastModifiedDate":"2024-02-27"},{"lineNumber":80,"author":{"gitId":"DhiraPT"},"content":"* `/new NAME, PHONE_NUMBER, EMAIL, [YEAR_JOINED]`","lastModifiedDate":"2024-02-27"},{"lineNumber":81,"author":{"gitId":"DhiraPT"},"content":"* `/new :name NAME :phone PHONE_NUMBER :email EMAIL [:year YEAR_JOINED]`","lastModifiedDate":"2024-02-27"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"DhiraPT"},"content":"* `/new jennie, 12334546, 123@gmail.com, 2021`","lastModifiedDate":"2024-02-27"},{"lineNumber":85,"author":{"gitId":"DhiraPT"},"content":"* `/new :name jennie :phone 12334546 :email 123@gmail.com :year 2021`","lastModifiedDate":"2024-02-27"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"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":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"PateShin"},"content":"**Format:** `list`","lastModifiedDate":"2024-02-28"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"linnn-7"},"content":"### Editing a person : `/edit`","lastModifiedDate":"2024-02-28"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"linnn-7"},"content":"Edits an existing employee in the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"linnn-7"},"content":"Format: `/edit ID [:name NAME] [:phone PHONE] [:email EMAIL] [:tag TAG]`","lastModifiedDate":"2024-02-28"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"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":100,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"linnn-7"},"content":"* When editing tags, all the existing tags of the person will be removed.","lastModifiedDate":"2024-02-28"},{"lineNumber":103,"author":{"gitId":"linnn-7"},"content":"* You can remove all the person’s tags by typing `:tag` without","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"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":108,"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":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"PateShin"},"content":"### Searching Workers by keyword: `find`","lastModifiedDate":"2024-02-28"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"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":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"PateShin"},"content":"**Format:**","lastModifiedDate":"2024-02-28"},{"lineNumber":115,"author":{"gitId":"PateShin"},"content":"* `Find by name: /find :name [name]`","lastModifiedDate":"2024-02-28"},{"lineNumber":116,"author":{"gitId":"PateShin"},"content":"* `Find by email: /find :email [email]`","lastModifiedDate":"2024-02-28"},{"lineNumber":117,"author":{"gitId":"PateShin"},"content":"* `Find by phone number: /find :phone [phone number]`","lastModifiedDate":"2024-02-28"},{"lineNumber":118,"author":{"gitId":"PateShin"},"content":"* `Find by worker’s ID: /find :ID [ID]`","lastModifiedDate":"2024-02-28"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"PateShin"},"content":"**Acceptable Format:**","lastModifiedDate":"2024-02-28"},{"lineNumber":121,"author":{"gitId":"PateShin"},"content":"* _Any letter cases are acceptable. e.g `Patrick` will match `patrick`_","lastModifiedDate":"2024-02-28"},{"lineNumber":122,"author":{"gitId":"PateShin"},"content":"* _ID: must be 6 digits of numbers_","lastModifiedDate":"2024-02-28"},{"lineNumber":123,"author":{"gitId":"PateShin"},"content":"* _Name: can be any case (Strings)_","lastModifiedDate":"2024-02-28"},{"lineNumber":124,"author":{"gitId":"PateShin"},"content":"* _Phone: must be numbers (integers)_","lastModifiedDate":"2024-02-28"},{"lineNumber":125,"author":{"gitId":"PateShin"},"content":"* _Email: must include “@”_","lastModifiedDate":"2024-02-28"},{"lineNumber":126,"author":{"gitId":"PateShin"},"content":"* _Only full keywords will be matched. e.g `Patrick` will not match `patr`_","lastModifiedDate":"2024-02-28"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"PateShin"},"content":"* `find :name John` returns `john` and `John Doe`","lastModifiedDate":"2024-02-28"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"ondretann"},"content":"Format: `remove ID`","lastModifiedDate":"2024-02-28"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"ondretann"},"content":"* Deletes the person with the specified `ID`.","lastModifiedDate":"2024-02-28"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"ondretann"},"content":"* `/remove 240001` deletes the person with `240001` ID.","lastModifiedDate":"2024-02-28"},{"lineNumber":141,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":142,"author":{"gitId":"ondretann"},"content":"### Tagging a person: `tag`","lastModifiedDate":"2024-02-28"},{"lineNumber":143,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":144,"author":{"gitId":"ondretann"},"content":"Tags the specified person from the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":145,"author":{"gitId":"ondretann"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":146,"author":{"gitId":"ondretann"},"content":"Format: `/tag ID t/TAG...`","lastModifiedDate":"2024-02-28"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"ondretann"},"content":"* Tags the person with the specified `ID`.","lastModifiedDate":"2024-02-28"},{"lineNumber":149,"author":{"gitId":"ondretann"},"content":"* Allowed to have more than 1 tags per person.","lastModifiedDate":"2024-02-28"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"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":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"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":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":172,"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":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":175,"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":176,"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":177,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"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":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":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":194,"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":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":196,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":198,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"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":203,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"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":206,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"linnn-7":13,"PateShin":17,"DhiraPT":9,"-":155,"ondretann":14}},{"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":"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":"-"},"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":"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":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"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":284,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"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":"linnn-7"},"content":"(For all use cases below, the **System** is the `PayBack` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"linnn-7"},"content":"**Use case: Edit an employee**","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"linnn-7"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"linnn-7"},"content":"1. User requests to edit an employee\u0027s information","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"linnn-7"},"content":"2. User enters the employee\u0027s ID and fields that need to be updated","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"linnn-7"},"content":"3. PayBack changes the employee\u0027s information accordingly","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"linnn-7"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"linnn-7"},"content":"* 2a. The ID is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"linnn-7"},"content":" * 2a1. PayBack shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"linnn-7"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"linnn-7"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"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":337,"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":338,"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":339,"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":340,"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":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"\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":354,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"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":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"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":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"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":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"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":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"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":388,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"linnn-7":29,"-":369}},{"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}}] diff --git a/AY2324S2-CS2103T-T12-4_tp_master/commits.json b/AY2324S2-CS2103T-T12-4_tp_master/commits.json index 1ff85b48..71f2ddfe 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":{}}]}],"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":{}}]}],"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}}}]}],"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}}}]}]},"authorFileTypeContributionMap":{"linnn-7":{"docs":21,"functional-code":0,"test-code":0,"other":1},"PateShin":{"docs":20,"functional-code":0,"test-code":0},"DhiraPT":{"docs":13,"functional-code":0,"test-code":0},"ondretann":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"linnn-7":245.0,"PateShin":361.25,"DhiraPT":108.88889,"ondretann":133.47223},"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":{}}]}],"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":{}}]}],"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}}}]}],"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}}}]}]},"authorFileTypeContributionMap":{"linnn-7":{"docs":76,"functional-code":0,"test-code":0,"other":1},"PateShin":{"docs":19,"functional-code":0,"test-code":0},"DhiraPT":{"docs":13,"functional-code":0,"test-code":0},"ondretann":{"docs":13,"functional-code":0,"test-code":0}},"authorContributionVariance":{"linnn-7":1754.1304,"PateShin":184.68645,"DhiraPT":55.668625,"ondretann":68.236694},"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-2_tp_master/authorship.json b/AY2324S2-CS2103T-T13-2_tp_master/authorship.json index 42d92f1a..660e95df 100644 --- a/AY2324S2-CS2103T-T13-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T13-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":"cocoanautz"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T13-2/tp/graph/badge.svg?token\u003dX8FVKZE2OZ)](https://codecov.io/gh/AY2324S2-CS2103T-T13-2/tp)","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"cocoanautz"},"content":"","lastModifiedDate":"2024-02-24"},{"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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"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":12,"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":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":{"cocoanautz":2,"-":14}},{"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":"cocoanautz"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eInternBook\u003c/a\u003e","lastModifiedDate":"2024-02-24"},{"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":{"cocoanautz":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"cocoanautz"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T13-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T13-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"cocoanautz"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T13-2/tp/graph/badge.svg?token\u003dX8FVKZE2OZ)](https://codecov.io/gh/AY2324S2-CS2103T-T13-2/tp)","lastModifiedDate":"2024-02-24"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-24"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"cocoanautz"},"content":"# InternBook","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"cocoanautz"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"cocoanautz"},"content":"As a student looking for internships, it is often hard to keep track of the many different internship applications.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"cocoanautz"},"content":"One of the solutions is to do so in an excel sheet, ","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"cocoanautz"},"content":"but such a user interface can become very hard to manage when there are many concurrent applications going on.","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"cocoanautz"},"content":"Thus, having a CLI based interface can make it much easier for data input and query.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"cocoanautz"},"content":"Our app hopes to reduce the effort needed to track internships, so that students can spend the time searching instead. ","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"cocoanautz"},"content":"Our app will aim to record employers’ emails, job descriptions and application dates.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"cocoanautz"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"cocoanautz"},"content":"## Getting Started","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"cocoanautz"},"content":"1. Ensure that Java 11 is available on your machine.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"cocoanautz"},"content":"2. Download the jar file from here.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"cocoanautz"},"content":"3. Navigate to the file\u0027s location in the shell of your choice.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"cocoanautz"},"content":"4. Run the jar file with the follow command","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"cocoanautz"},"content":"```shell","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"cocoanautz"},"content":"java -jar internBook.jar","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"cocoanautz"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"cocoanautz"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"cocoanautz"},"content":"For the detailed documentation of this project, see the **[InternBook Product Website](https://ay2324s2-cs2103t-t13-2.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"cocoanautz"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"cocoanautz"},"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":{"cocoanautz":23,"-":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":"cocoanautz"},"content":"### Isaac Ong","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cocoanautz"},"content":"\u003cimg src\u003d\"images/cocoanautz.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cocoanautz"},"content":"[[github](https://github.com/cocoanautz)]","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"cocoanautz"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"cocoanautz"},"content":"* Responsibilities: Dev Ops","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"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: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"cocoanautz":5,"-":55}},{"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":"cocoanautz"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eInternBook\u003c/a\u003e","lastModifiedDate":"2024-02-24"},{"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":{"cocoanautz":1,"-":66}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"cocoanautz"},"content":"# InternBook ","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"cocoanautz"},"content":"**InternBook is a desktop application for managing your internship contact 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":"cocoanautz"},"content":"* If you are interested in using InternBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"cocoanautz"},"content":"* If you are interested about developing InternBook, 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":"-"},"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":{"cocoanautz":4,"-":17}}] diff --git a/AY2324S2-CS2103T-T13-2_tp_master/commits.json b/AY2324S2-CS2103T-T13-2_tp_master/commits.json index 7cb6ee9e..1ff51fbd 100644 --- a/AY2324S2-CS2103T-T13-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T13-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Xilef121":[],"jasperng-nus":[],"cocoanautz":[{"date":"2024-02-24","commitResults":[{"hash":"ff0b6a746fcdc42619e304ab6776ce9efbd759b3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Display CodeCov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"97c98a6f69c5b381b1f9f29c414c4500d2c4451b","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T13-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"14924502b2bbba9059f33093e271b88a960b8b1d","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f6e2ce1b8b15d46175011cc715b2d69bb13c1046","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T13-2/cocoanautz-patch-1","messageBody":"MarkBind Support","fileTypesAndContributionMap":{}}]}],"AjayArvind2207":[],"SherwynNg":[]},"authorFileTypeContributionMap":{"Xilef121":{"docs":0,"functional-code":0,"test-code":0},"jasperng-nus":{"docs":0,"functional-code":0,"test-code":0},"cocoanautz":{"docs":3,"functional-code":0,"test-code":0},"AjayArvind2207":{"docs":0,"functional-code":0,"test-code":0},"SherwynNg":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Xilef121":0.0,"jasperng-nus":0.0,"cocoanautz":4.0,"AjayArvind2207":0.0,"SherwynNg":0.0},"authorDisplayNameMap":{"Xilef121":"CS2103T-T13-2 FELI..I ZE","jasperng-nus":"CS2103T-T13-2 NG W..SPER","cocoanautz":"CS2103T-T13-2 ONG ..SAAC","AjayArvind2207":"CS2103T-T13-2 ARVI..AJAY","SherwynNg":"CS2103T-T13-2 SHER.. XIN"}} +{"authorDailyContributionsMap":{"Xilef121":[],"jasperng-nus":[],"cocoanautz":[{"date":"2024-02-24","commitResults":[{"hash":"ff0b6a746fcdc42619e304ab6776ce9efbd759b3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Display CodeCov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"97c98a6f69c5b381b1f9f29c414c4500d2c4451b","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T13-2/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"14924502b2bbba9059f33093e271b88a960b8b1d","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f6e2ce1b8b15d46175011cc715b2d69bb13c1046","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T13-2/cocoanautz-patch-1","messageBody":"MarkBind Support","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"b1f76ad11d82f0fe06c1d0de0577757b1e44c914","isMergeCommit":false,"messageTitle":"Update AboutUs.md and README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":17}}},{"hash":"e85a74f05dfef28f402c1b7480211d1882942d63","isMergeCommit":false,"messageTitle":"Fix CI issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3998df81261749adde4c355e377b3580c75e5636","isMergeCommit":false,"messageTitle":"Fix CI issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":2}}},{"hash":"2d6eb042be88097bb376dd6f0df26f19b6cd055c","isMergeCommit":false,"messageTitle":"Update Ui preview","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4cad79eb7a5f0f42ed24644749608a2b206581e4","isMergeCommit":false,"messageTitle":"Update Ui Image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"cedd06d22581ec7680a307e46892e853dd3490b5","isMergeCommit":false,"messageTitle":"Fix syntax error in README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"AjayArvind2207":[],"SherwynNg":[{"date":"2024-03-06","commitResults":[{"hash":"c6a5652ec9952caabacdf231eea546fa60ffe6fe","isMergeCommit":true,"messageTitle":"Merge pull request #7 from cocoanautz/branch-AboutUs-Isaac","messageBody":"Update AboutUs.md and README.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Xilef121":{"docs":0,"functional-code":0,"test-code":0},"jasperng-nus":{"docs":0,"functional-code":0,"test-code":0},"cocoanautz":{"docs":33,"functional-code":0,"test-code":0},"AjayArvind2207":{"docs":0,"functional-code":0,"test-code":0},"SherwynNg":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Xilef121":0.0,"jasperng-nus":0.0,"cocoanautz":288.94675,"AjayArvind2207":0.0,"SherwynNg":0.0},"authorDisplayNameMap":{"Xilef121":"CS2103T-T13-2 FELI..I ZE","jasperng-nus":"CS2103T-T13-2 NG W..SPER","cocoanautz":"CS2103T-T13-2 ONG ..SAAC","AjayArvind2207":"CS2103T-T13-2 ARVI..AJAY","SherwynNg":"CS2103T-T13-2 SHER.. XIN"}} diff --git a/AY2324S2-CS2103T-T13-3_tp_master/authorship.json b/AY2324S2-CS2103T-T13-3_tp_master/authorship.json index f33d02b8..ee4a4afa 100644 --- a/AY2324S2-CS2103T-T13-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T13-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ibnu2651"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T13-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T13-3/tp/actions)","lastModifiedDate":"2024-03-03"},{"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":"ibnu2651"},"content":"* Insura-Connect is an enhanced version of the AddressBook-Level3 project, which serves as a personal contact management tool for insurance agents.","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"ibnu2651"},"content":"* It provides fast access to client contact details, easily manage client relationships, collaborate with industry partners, and stay organised in a fast-paced industry","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"ibnu2651"},"content":"* For the detailed documentation of this project, see the **[Insura-Connect Product Website](https://ay2324s2-cs2103t-t13-3.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"ibnu2651"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"ibnu2651":5,"-":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":"kaiyi27"},"content":"### Teoh Kai Yi","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaiyi27"},"content":"\u003cimg src\u003d\"images/kaiyi27.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"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":"kaiyi27"},"content":"[[github](https://github.com/kaiyi27)]","lastModifiedDate":"2024-03-02"},{"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: Developer","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"kaiyi27"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"ibnu2651"},"content":"### Ibnu Taimiyyah Bin Adam","lastModifiedDate":"2024-03-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ibnu2651"},"content":"\u003cimg src\u003d\"images/ibnu2651.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"ibnu2651"},"content":"[[github](https://github.com/ibnu2651)]","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ibnu2651"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Shauryan123"},"content":"### Shauryan Agrawal","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Shauryan123"},"content":"\u003cimg src\u003d\"images/Shauryan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"Shauryan123"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Shauryan123":3,"kaiyi27":4,"ibnu2651":4,"-":31}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"ibnu2651"},"content":"# Insura-Connect Developer Guide","lastModifiedDate":"2024-03-03"},{"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":"kaiyi27"},"content":"|----------|-------------------------------------------|---------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-02"},{"lineNumber":292,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | fast typing user | have a CLI | use the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":293,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | busy user | clear all my data quickly | quickly restart a new list of contacts |","lastModifiedDate":"2024-03-02"},{"lineNumber":294,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | see my relationship with my contacts | know who they are |","lastModifiedDate":"2024-03-02"},{"lineNumber":295,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | find a certain client based on a keyword | easier to find the client |","lastModifiedDate":"2024-03-02"},{"lineNumber":296,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | save and retrieve information | use the app in multiple sessions |","lastModifiedDate":"2024-03-02"},{"lineNumber":297,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | add data about clients to the application | record information about my client |","lastModifiedDate":"2024-03-02"},{"lineNumber":298,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | see what the app will look like with sample data | more easily understand the potential features |","lastModifiedDate":"2024-03-02"},{"lineNumber":299,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | have a tutorial of the basic features | get started with using the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":300,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access a help page with basic commands | familiarize myself with how to use the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":301,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | track my client information | manage my work using the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":302,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access past activity since app installation | see my current progress |","lastModifiedDate":"2024-03-02"},{"lineNumber":303,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | save similar client information data into a group | manage them easily |","lastModifiedDate":"2024-03-02"},{"lineNumber":304,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | reorganize my list of contacts | access them more clearly and efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":305,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | edit my contacts as a group | easier to implement changes if something in common in the group changes |","lastModifiedDate":"2024-03-02"},{"lineNumber":306,"author":{"gitId":"kaiyi27"},"content":"| `* *` | careless user | have an undo command | prevent doing some mistake |","lastModifiedDate":"2024-03-02"},{"lineNumber":307,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | filter client information | sort my client information according to some condition |","lastModifiedDate":"2024-03-02"},{"lineNumber":308,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | record if I am successful in securing an agreement | know I have succeeded at my job |","lastModifiedDate":"2024-03-02"},{"lineNumber":309,"author":{"gitId":"kaiyi27"},"content":"| `*` | busy user | autocomplete my commands | type commands faster |","lastModifiedDate":"2024-03-02"},{"lineNumber":310,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | tag my clients | classify common groups |","lastModifiedDate":"2024-03-02"},{"lineNumber":311,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | have common use shortcut keys command | access the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":312,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | track progress of engagements via tags | monitor the progress of different engagements with clients |","lastModifiedDate":"2024-03-02"},{"lineNumber":313,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | copy information/features to another client | reduce the time used |","lastModifiedDate":"2024-03-02"},{"lineNumber":314,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | quickly differentiate between clients and business partners | differentiate between them |","lastModifiedDate":"2024-03-02"},{"lineNumber":315,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | rate clients for effective feedback | provide feedback efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":316,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | customize the app’s theme | better suits my preferences |","lastModifiedDate":"2024-03-02"},{"lineNumber":317,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create shortcuts for tasks | save time on frequently performed tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":318,"author":{"gitId":"kaiyi27"},"content":"| `*` | long-time user | archive/hide unused data | not distracted by irrelevant data |","lastModifiedDate":"2024-03-02"},{"lineNumber":319,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | have templates for adding contacts | contacts are standardized and easier to read |","lastModifiedDate":"2024-03-02"},{"lineNumber":320,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | schedule weekly check-ins with clients | do not forget about them |","lastModifiedDate":"2024-03-02"},{"lineNumber":321,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | have reminders for meetings with clients | organize and plan my time well |","lastModifiedDate":"2024-03-02"},{"lineNumber":322,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create automated task workflows | save time on performing repeated tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":323,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | see a competency rating based on past successes | know if I need to improve |","lastModifiedDate":"2024-03-02"},{"lineNumber":324,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | find clients based on different filters | better focus on one particular group |","lastModifiedDate":"2024-03-02"},{"lineNumber":325,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | disable unnecessary features | the application is more customized and simpler to use |","lastModifiedDate":"2024-03-02"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"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":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"kaiyi27"},"content":"**Use case: List out the contact information**","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"kaiyi27"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"kaiyi27"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"kaiyi27"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"kaiyi27"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"ibnu2651"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"ibnu2651"},"content":"**Use case: Filter the list of clients**","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"ibnu2651"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"ibnu2651"},"content":"1. User requests to filter list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"ibnu2651"},"content":"2. AddressBook shows a list of persons that satisfy the filter","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"ibnu2651"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"kaiyi27"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"Shauryan123"},"content":"**Use case: Add a new person**","lastModifiedDate":"2024-03-05"},{"lineNumber":386,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"Shauryan123"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"Shauryan123"},"content":"1. User requests to add a new person.","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"Shauryan123"},"content":"2. AddressBook prompts the user to enter the details of the person.","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"Shauryan123"},"content":"3. User enters the details of the person.","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"Shauryan123"},"content":"4. AddressBook adds the new person to the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"Shauryan123"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"Shauryan123"},"content":"* 3a. The user enters invalid details.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"Shauryan123"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"Shauryan123"},"content":" * 3a2. AddressBook prompts the user to enter the details again.","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"Shauryan123"},"content":"**Use case: Update a person\u0027s details**","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"Shauryan123"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"Shauryan123"},"content":"1. User requests to list persons..","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"Shauryan123"},"content":"2. AddressBook shows a list of persons.","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"Shauryan123"},"content":"3. User requests to update the details of a specific person in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"Shauryan123"},"content":"4. AddressBook prompts the user to enter the new details.","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"Shauryan123"},"content":"5. User enters the new details.","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"Shauryan123"},"content":"6. AddressBook updates the person\u0027s details.","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"Shauryan123"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"Shauryan123"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"Shauryan123"},"content":"* 3a. The given index is invalid..","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"Shauryan123"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":430,"author":{"gitId":"Shauryan123"},"content":"* 5a. The user enters invalid details.","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"Shauryan123"},"content":" * 5a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"Shauryan123"},"content":" * 5a2. AddressBook prompts the user to enter the details again.","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":435,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"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":444,"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":445,"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":446,"author":{"gitId":"ibnu2651"},"content":"4. The response to any use action should become visible within 5 seconds.","lastModifiedDate":"2024-03-03"},{"lineNumber":447,"author":{"gitId":"ibnu2651"},"content":"5. Should have a user-friendly interface that is easy to navigate and understand.","lastModifiedDate":"2024-03-03"},{"lineNumber":448,"author":{"gitId":"ibnu2651"},"content":"6. Should be stable and not crash or lose data under normal use.","lastModifiedDate":"2024-03-03"},{"lineNumber":449,"author":{"gitId":"Shauryan123"},"content":"7. Should be able to handle increasing amounts of data and users without significant degradation in performance (Scalability).","lastModifiedDate":"2024-03-05"},{"lineNumber":450,"author":{"gitId":"Shauryan123"},"content":"8. Should protect sensitive data and prevent unauthorized access, ensuring data integrity and confidentiality (Security).","lastModifiedDate":"2024-03-05"},{"lineNumber":451,"author":{"gitId":"Shauryan123"},"content":"9. Should be easy to maintain, with clear documentation and a modular design that allows for easy updates and fixes .","lastModifiedDate":"2024-03-05"},{"lineNumber":452,"author":{"gitId":"Shauryan123"},"content":"10. Should be accessible to users with disabilities, following guidelines such as the Web Content Accessibility Guidelines (WCAG).","lastModifiedDate":"2024-03-05"},{"lineNumber":453,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":460,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":470,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":471,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"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":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"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":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"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":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"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":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"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":505,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Shauryan123":59,"kaiyi27":49,"ibnu2651":20,"-":387}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eInsura-Connect\u003c/a\u003e","lastModifiedDate":"2024-02-18"},{"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":"ibnu2651"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-T13-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-03"},{"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":{"ibnu2651":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ibnu2651"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T13-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T13-3/tp/actions)","lastModifiedDate":"2024-03-03"},{"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":"ibnu2651"},"content":"* Insura-Connect is an enhanced version of the AddressBook-Level3 project, which serves as a personal contact management tool for insurance agents.","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"ibnu2651"},"content":"* It provides fast access to client contact details, easily manage client relationships, collaborate with industry partners, and stay organised in a fast-paced industry","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"ibnu2651"},"content":"* For the detailed documentation of this project, see the **[Insura-Connect Product Website](https://ay2324s2-cs2103t-t13-3.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"ibnu2651"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"ibnu2651":5,"-":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":"kaiyi27"},"content":"### Teoh Kai Yi","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaiyi27"},"content":"\u003cimg src\u003d\"images/kaiyi27.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"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":"kaiyi27"},"content":"[[github](https://github.com/kaiyi27)]","lastModifiedDate":"2024-03-02"},{"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: Developer","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"kaiyi27"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"ibnu2651"},"content":"### Ibnu Taimiyyah Bin Adam","lastModifiedDate":"2024-03-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ibnu2651"},"content":"\u003cimg src\u003d\"images/ibnu2651.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"ibnu2651"},"content":"[[github](https://github.com/ibnu2651)]","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ibnu2651"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Shauryan123"},"content":"### Shauryan Agrawal","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Shauryan123"},"content":"\u003cimg src\u003d\"images/Shauryan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"Shauryan123"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Shauryan123":3,"kaiyi27":4,"ibnu2651":4,"-":31}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"ibnu2651"},"content":"# Insura-Connect Developer Guide","lastModifiedDate":"2024-03-03"},{"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":"ibnu2651"},"content":"* insurance agents","lastModifiedDate":"2024-03-06"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"ibnu2651"},"content":"* needs to differentiate between different types of contacts","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"ibnu2651"},"content":"* track the status of contacts","lastModifiedDate":"2024-03-06"},{"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":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":284,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"ibnu2651"},"content":"**Value proposition**: Provides fast access to client contact details, easily manage client relationships, collaborate with industry partners, and stay organised in a fast-paced industry.","lastModifiedDate":"2024-03-06"},{"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":"kaiyi27"},"content":"|----------|-------------------------------------------|---------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-02"},{"lineNumber":295,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | fast typing user | have a CLI | use the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":296,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | busy user | clear all my data quickly | quickly restart a new list of contacts |","lastModifiedDate":"2024-03-02"},{"lineNumber":297,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | see my relationship with my contacts | know who they are |","lastModifiedDate":"2024-03-02"},{"lineNumber":298,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | find a certain client based on a keyword | easier to find the client |","lastModifiedDate":"2024-03-02"},{"lineNumber":299,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | save and retrieve information | use the app in multiple sessions |","lastModifiedDate":"2024-03-02"},{"lineNumber":300,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | add data about clients to the application | record information about my client |","lastModifiedDate":"2024-03-02"},{"lineNumber":301,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | see what the app will look like with sample data | more easily understand the potential features |","lastModifiedDate":"2024-03-02"},{"lineNumber":302,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | have a tutorial of the basic features | get started with using the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":303,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access a help page with basic commands | familiarize myself with how to use the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":304,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | track my client information | manage my work using the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":305,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access past activity since app installation | see my current progress |","lastModifiedDate":"2024-03-02"},{"lineNumber":306,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | save similar client information data into a group | manage them easily |","lastModifiedDate":"2024-03-02"},{"lineNumber":307,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | reorganize my list of contacts | access them more clearly and efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":308,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | edit my contacts as a group | easier to implement changes if something in common in the group changes |","lastModifiedDate":"2024-03-02"},{"lineNumber":309,"author":{"gitId":"kaiyi27"},"content":"| `* *` | careless user | have an undo command | prevent doing some mistake |","lastModifiedDate":"2024-03-02"},{"lineNumber":310,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | filter client information | sort my client information according to some condition |","lastModifiedDate":"2024-03-02"},{"lineNumber":311,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | record if I am successful in securing an agreement | know I have succeeded at my job |","lastModifiedDate":"2024-03-02"},{"lineNumber":312,"author":{"gitId":"kaiyi27"},"content":"| `*` | busy user | autocomplete my commands | type commands faster |","lastModifiedDate":"2024-03-02"},{"lineNumber":313,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | tag my clients | classify common groups |","lastModifiedDate":"2024-03-02"},{"lineNumber":314,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | have common use shortcut keys command | access the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":315,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | track progress of engagements via tags | monitor the progress of different engagements with clients |","lastModifiedDate":"2024-03-02"},{"lineNumber":316,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | copy information/features to another client | reduce the time used |","lastModifiedDate":"2024-03-02"},{"lineNumber":317,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | quickly differentiate between clients and business partners | differentiate between them |","lastModifiedDate":"2024-03-02"},{"lineNumber":318,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | rate clients for effective feedback | provide feedback efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":319,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | customize the app’s theme | better suits my preferences |","lastModifiedDate":"2024-03-02"},{"lineNumber":320,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create shortcuts for tasks | save time on frequently performed tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":321,"author":{"gitId":"kaiyi27"},"content":"| `*` | long-time user | archive/hide unused data | not distracted by irrelevant data |","lastModifiedDate":"2024-03-02"},{"lineNumber":322,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | have templates for adding contacts | contacts are standardized and easier to read |","lastModifiedDate":"2024-03-02"},{"lineNumber":323,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | schedule weekly check-ins with clients | do not forget about them |","lastModifiedDate":"2024-03-02"},{"lineNumber":324,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | have reminders for meetings with clients | organize and plan my time well |","lastModifiedDate":"2024-03-02"},{"lineNumber":325,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create automated task workflows | save time on performing repeated tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":326,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | see a competency rating based on past successes | know if I need to improve |","lastModifiedDate":"2024-03-02"},{"lineNumber":327,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | find clients based on different filters | better focus on one particular group |","lastModifiedDate":"2024-03-02"},{"lineNumber":328,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | disable unnecessary features | the application is more customized and simpler to use |","lastModifiedDate":"2024-03-02"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"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":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"kaiyi27"},"content":"**Use case: List out the contact information**","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"kaiyi27"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"kaiyi27"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"kaiyi27"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"kaiyi27"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"ibnu2651"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"ibnu2651"},"content":"**Use case: Filter the list of clients**","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"ibnu2651"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"ibnu2651"},"content":"1. User requests to filter list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"ibnu2651"},"content":"2. AddressBook shows a list of persons that satisfy the filter","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"ibnu2651"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"kaiyi27"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":385,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":386,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"Shauryan123"},"content":"**Use case: Add a new person**","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"Shauryan123"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"Shauryan123"},"content":"1. User requests to add a new person.","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"Shauryan123"},"content":"2. AddressBook prompts the user to enter the details of the person.","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"Shauryan123"},"content":"3. User enters the details of the person.","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"Shauryan123"},"content":"4. AddressBook adds the new person to the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"Shauryan123"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"Shauryan123"},"content":"* 3a. The user enters invalid details.","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"Shauryan123"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"Shauryan123"},"content":" * 3a2. AddressBook prompts the user to enter the details again.","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"Shauryan123"},"content":"**Use case: Update a person\u0027s details**","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"Shauryan123"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"Shauryan123"},"content":"1. User requests to list persons..","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"Shauryan123"},"content":"2. AddressBook shows a list of persons.","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"Shauryan123"},"content":"3. User requests to update the details of a specific person in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"Shauryan123"},"content":"4. AddressBook prompts the user to enter the new details.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"Shauryan123"},"content":"5. User enters the new details.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"Shauryan123"},"content":"6. AddressBook updates the person\u0027s details.","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"Shauryan123"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"Shauryan123"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"Shauryan123"},"content":"* 3a. The given index is invalid..","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"Shauryan123"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":430,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"Shauryan123"},"content":"* 5a. The user enters invalid details.","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":435,"author":{"gitId":"Shauryan123"},"content":" * 5a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"Shauryan123"},"content":" * 5a2. AddressBook prompts the user to enter the details again.","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":444,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"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":447,"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":448,"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":449,"author":{"gitId":"ibnu2651"},"content":"4. The response to any use action should become visible within 5 seconds.","lastModifiedDate":"2024-03-03"},{"lineNumber":450,"author":{"gitId":"ibnu2651"},"content":"5. Should have a user-friendly interface that is easy to navigate and understand.","lastModifiedDate":"2024-03-03"},{"lineNumber":451,"author":{"gitId":"ibnu2651"},"content":"6. Should be stable and not crash or lose data under normal use.","lastModifiedDate":"2024-03-03"},{"lineNumber":452,"author":{"gitId":"Shauryan123"},"content":"7. Should be able to handle increasing amounts of data and users without significant degradation in performance (Scalability).","lastModifiedDate":"2024-03-05"},{"lineNumber":453,"author":{"gitId":"Shauryan123"},"content":"8. Should protect sensitive data and prevent unauthorized access, ensuring data integrity and confidentiality (Security).","lastModifiedDate":"2024-03-05"},{"lineNumber":454,"author":{"gitId":"Shauryan123"},"content":"9. Should be easy to maintain, with clear documentation and a modular design that allows for easy updates and fixes .","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"Shauryan123"},"content":"10. Should be accessible to users with disabilities, following guidelines such as the Web Content Accessibility Guidelines (WCAG).","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":463,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":473,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":474,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"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":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"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":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"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":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"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":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"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":508,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Shauryan123":59,"kaiyi27":49,"ibnu2651":24,"-":386}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eInsura-Connect\u003c/a\u003e","lastModifiedDate":"2024-02-18"},{"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":"ibnu2651"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-T13-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-03"},{"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":{"ibnu2651":1,"-":66}}] diff --git a/AY2324S2-CS2103T-T13-3_tp_master/commits.json b/AY2324S2-CS2103T-T13-3_tp_master/commits.json index 6a9c4049..307983cf 100644 --- a/AY2324S2-CS2103T-T13-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T13-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Shauryan123":[{"date":"2024-03-05","commitResults":[{"hash":"e1a2a39cacb0e720e3ad334bbe26deeadb1a70f0","isMergeCommit":false,"messageTitle":"Update Shauryan\u0027s Details in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1d05c2fda6e1f6be4af0cc0a8f4952f56d6a778b","isMergeCommit":false,"messageTitle":"Update NFRs for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":0}}},{"hash":"ccaff0de905fee27e17894e4f65c41522ab4dbcc","isMergeCommit":false,"messageTitle":"Add use cases for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}}]}],"kaiyi27":[{"date":"2024-03-02","commitResults":[{"hash":"2b709c27cdc0e467935fab1c304ae051db9460b4","isMergeCommit":false,"messageTitle":"Update the information in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"684854fd649bd41c769dac772c157a435c64aa3c","isMergeCommit":false,"messageTitle":"Update the role in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"33ba8c517ca9bf95e514edd7bff76ee59ec3fdea","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":9}}}]},{"date":"2024-03-03","commitResults":[{"hash":"ba193c6471d9428566087a7aa3533551937a708c","isMergeCommit":false,"messageTitle":"Add list use case into DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":1}}},{"hash":"8cab7ca2a32c8f2a049f6d0546caf879c318fb4d","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ibnu2651/branch-v1.1","messageBody":"Branch v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d23177206affb4837bc6ea4486b0ce55655bc301","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ibnu2651/branch-v1.1","messageBody":"Branch v1.1","fileTypesAndContributionMap":{}}]}],"ibnu2651":[{"date":"2024-03-03","commitResults":[{"hash":"332f64d287ee64b1cebb86e021ce954e3020482d","isMergeCommit":true,"messageTitle":"Merge pull request #8 from kaiyi27/branch-v1.1","messageBody":"Merge Branch v1.1","fileTypesAndContributionMap":{}},{"hash":"c084f1ee4ed2c7f1ceba0373852f3e3de87e8b1c","isMergeCommit":false,"messageTitle":"Add Ibnu\u0027s details to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":26}}},{"hash":"a7908bdb075a4686c142535b04ea8ae0121044f3","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"66a785617d6e30c9c5ca2be74f9f242324f5ba89","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-README\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5d069e37e88e4930db97f644654f6157ee0b6884","isMergeCommit":false,"messageTitle":"Update site-wide settings","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"47a6255e56b86124d2b3ebd9d38b904fb6478ed9","isMergeCommit":false,"messageTitle":"Update NFR for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"743be88c300f7b9de1589b26cc814d63d42ae318","isMergeCommit":false,"messageTitle":"Add use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"02649cf841f03825e98dd4a6a87a0d38f74c9881","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Shauryan123/branch-v1.1","messageBody":"Merge Branch v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"2c69811450922ebed9c6bee757926198580729f6","isMergeCommit":false,"messageTitle":"Update README contents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":10}}}]}],"justincred":[]},"authorFileTypeContributionMap":{"Shauryan123":{"docs":62,"functional-code":0,"test-code":0},"kaiyi27":{"docs":53,"functional-code":0,"test-code":0},"ibnu2651":{"docs":30,"functional-code":0,"test-code":0},"justincred":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Shauryan123":328.33136,"kaiyi27":213.44379,"ibnu2651":258.39053,"justincred":0.0},"authorDisplayNameMap":{"Shauryan123":"CS2103T-T13-3 AGRA..RYAN","kaiyi27":"CS2103T-T13-3 TEOH..I YI","ibnu2651":"CS2103T-T13-3 IBNU..ADAM","justincred":"CS2103T-T13-3 JUST..HWEI"}} +{"authorDailyContributionsMap":{"Shauryan123":[{"date":"2024-03-05","commitResults":[{"hash":"e1a2a39cacb0e720e3ad334bbe26deeadb1a70f0","isMergeCommit":false,"messageTitle":"Update Shauryan\u0027s Details in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1d05c2fda6e1f6be4af0cc0a8f4952f56d6a778b","isMergeCommit":false,"messageTitle":"Update NFRs for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":0}}},{"hash":"ccaff0de905fee27e17894e4f65c41522ab4dbcc","isMergeCommit":false,"messageTitle":"Add use cases for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}}]}],"kaiyi27":[{"date":"2024-03-02","commitResults":[{"hash":"2b709c27cdc0e467935fab1c304ae051db9460b4","isMergeCommit":false,"messageTitle":"Update the information in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"684854fd649bd41c769dac772c157a435c64aa3c","isMergeCommit":false,"messageTitle":"Update the role in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"33ba8c517ca9bf95e514edd7bff76ee59ec3fdea","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":9}}}]},{"date":"2024-03-03","commitResults":[{"hash":"ba193c6471d9428566087a7aa3533551937a708c","isMergeCommit":false,"messageTitle":"Add list use case into DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":1}}},{"hash":"8cab7ca2a32c8f2a049f6d0546caf879c318fb4d","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ibnu2651/branch-v1.1","messageBody":"Branch v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d23177206affb4837bc6ea4486b0ce55655bc301","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ibnu2651/branch-v1.1","messageBody":"Branch v1.1","fileTypesAndContributionMap":{}},{"hash":"ad6071ea69e3052d69a0afdd1ccbbf29fbd2f429","isMergeCommit":true,"messageTitle":"Merge pull request #15 from ibnu2651/branch-v1.1","messageBody":"Update product scope in DG","fileTypesAndContributionMap":{}}]}],"ibnu2651":[{"date":"2024-03-03","commitResults":[{"hash":"332f64d287ee64b1cebb86e021ce954e3020482d","isMergeCommit":true,"messageTitle":"Merge pull request #8 from kaiyi27/branch-v1.1","messageBody":"Merge Branch v1.1","fileTypesAndContributionMap":{}},{"hash":"c084f1ee4ed2c7f1ceba0373852f3e3de87e8b1c","isMergeCommit":false,"messageTitle":"Add Ibnu\u0027s details to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":26}}},{"hash":"a7908bdb075a4686c142535b04ea8ae0121044f3","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"66a785617d6e30c9c5ca2be74f9f242324f5ba89","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-README\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5d069e37e88e4930db97f644654f6157ee0b6884","isMergeCommit":false,"messageTitle":"Update site-wide settings","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"47a6255e56b86124d2b3ebd9d38b904fb6478ed9","isMergeCommit":false,"messageTitle":"Update NFR for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"743be88c300f7b9de1589b26cc814d63d42ae318","isMergeCommit":false,"messageTitle":"Add use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"02649cf841f03825e98dd4a6a87a0d38f74c9881","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Shauryan123/branch-v1.1","messageBody":"Merge Branch v1.1","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"2c69811450922ebed9c6bee757926198580729f6","isMergeCommit":false,"messageTitle":"Update README contents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":10}}},{"hash":"cd51f599422e90badc604585cfe433ed5341a7f4","isMergeCommit":false,"messageTitle":"Update product scope in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}}]}],"justincred":[]},"authorFileTypeContributionMap":{"Shauryan123":{"docs":62,"functional-code":0,"test-code":0},"kaiyi27":{"docs":53,"functional-code":0,"test-code":0},"ibnu2651":{"docs":34,"functional-code":0,"test-code":0},"justincred":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Shauryan123":328.33136,"kaiyi27":213.44379,"ibnu2651":265.84616,"justincred":0.0},"authorDisplayNameMap":{"Shauryan123":"CS2103T-T13-3 AGRA..RYAN","kaiyi27":"CS2103T-T13-3 TEOH..I YI","ibnu2651":"CS2103T-T13-3 IBNU..ADAM","justincred":"CS2103T-T13-3 JUST..HWEI"}} diff --git a/AY2324S2-CS2103T-T14-1_tp_master/authorship.json b/AY2324S2-CS2103T-T14-1_tp_master/authorship.json index 3cac2f4e..65ab5eda 100644 --- a/AY2324S2-CS2103T-T14-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T14-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: 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":"yiwern5"},"content":"### Tsui Yi Wern","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"yiwern5"},"content":"\u003cimg src\u003d\"images/yiwern5.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"yiwern5"},"content":"* Responsibilities: Scheduling and tracking, Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"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":"yiwern5"},"content":"[[github](http://github.com/yiwern5)]","lastModifiedDate":"2024-03-05"},{"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":{"yiwern5":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":"yiwern5"},"content":"# EffiTrack Developer Guide","lastModifiedDate":"2024-03-05"},{"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":"yiwern5"},"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":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"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":334,"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":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":351,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":352,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"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":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"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":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"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":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"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":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"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":386,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"yiwern5":2,"-":394}},{"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":"yiwern5"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eEffiTrack\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":{"yiwern5":1,"-":66}}] +[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"### 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":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"yiwern5"},"content":"### Tsui Yi Wern","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"yiwern5"},"content":"\u003cimg src\u003d\"images/yiwern5.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"yiwern5"},"content":"[[github](http://github.com/yiwern5)] [[portfolio](team/johndoe.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":"yiwern5"},"content":"* Responsibilities: Scheduling and tracking, Deliverables and deadlines, UI","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2024-03-06"},{"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":"-"},"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":{"yiwern5":4,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"yiwern5"},"content":"# EffiTrack Developer Guide","lastModifiedDate":"2024-03-05"},{"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":"yiwern5"},"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":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"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":334,"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":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":351,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":352,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"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":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"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":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"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":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"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":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"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":386,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"yiwern5":2,"-":394}},{"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":"yiwern5"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eEffiTrack\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":{"yiwern5":1,"-":66}}] diff --git a/AY2324S2-CS2103T-T14-1_tp_master/commits.json b/AY2324S2-CS2103T-T14-1_tp_master/commits.json index 7ff809cd..1aecf2b8 100644 --- a/AY2324S2-CS2103T-T14-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T14-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"KiatLun":[],"yiwern5":[{"date":"2024-02-26","commitResults":[{"hash":"6f56dc07d867733f444ba907d97d818fb135ef56","isMergeCommit":false,"messageTitle":"Configure MarkBind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"cd676177dcfec166a93be5b66897d883194aa9d0","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T14-1/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"49f56bf1f16bc1b4f9b45fab550e3193cf15deee","isMergeCommit":false,"messageTitle":"Adding Command","messageBody":"Tutorial\n","fileTypesAndContributionMap":{"functional-code":{"insertions":314,"deletions":118},"test-code":{"insertions":169,"deletions":15}}},{"hash":"4768e4fe53a49a57f47be123d799d9ec400714d8","isMergeCommit":false,"messageTitle":"Fix Adding Command","messageBody":"Checkstyle and run tests\n","fileTypesAndContributionMap":{"functional-code":{"insertions":61,"deletions":54},"test-code":{"insertions":135,"deletions":135}}}]},{"date":"2024-03-05","commitResults":[{"hash":"511c44cecc89f2f6718ac05c43a82e68f9c0943a","isMergeCommit":false,"messageTitle":"About Us and DG","messageBody":"Update photo and product name\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"ziyi22":[],"howen02":[{"date":"2024-03-05","commitResults":[{"hash":"835e0ad385ba8724647dcff810f1d4317b343ca7","isMergeCommit":true,"messageTitle":"Merge pull request #22 from yiwern5/yiwern-pw","messageBody":"Yi Wern About Us","fileTypesAndContributionMap":{}},{"hash":"4a4a2b6c4c514394b93d33b28d45e0dda177cec3","isMergeCommit":false,"messageTitle":"Revert \"Fix Adding Command\"","messageBody":"This reverts commit 4768e4fe53a49a57f47be123d799d9ec400714d8.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":54,"deletions":61},"test-code":{"insertions":135,"deletions":135}}},{"hash":"8e2519485cab2974d15edf2d0b22ff7a1375f4ee","isMergeCommit":false,"messageTitle":"Revert \"Adding Command\"","messageBody":"This reverts commit 49f56bf1f16bc1b4f9b45fab550e3193cf15deee.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":118,"deletions":314},"test-code":{"insertions":15,"deletions":169}}},{"hash":"7f2858d449394b63e01b1bd4337dd8359ccff147","isMergeCommit":true,"messageTitle":"Merge pull request #24 from howen02/master","messageBody":"Undo tutorial pull request","fileTypesAndContributionMap":{}}]}],"wolffe88":[]},"authorFileTypeContributionMap":{"KiatLun":{"docs":0,"functional-code":0,"test-code":0},"yiwern5":{"docs":7,"functional-code":0,"test-code":0},"ziyi22":{"docs":0,"functional-code":0,"test-code":0},"howen02":{"docs":0,"functional-code":0,"test-code":0},"wolffe88":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"KiatLun":0.0,"yiwern5":76358.08,"ziyi22":0.0,"howen02":76541.74,"wolffe88":0.0},"authorDisplayNameMap":{"KiatLun":"CS2103T-T14-1 KHOO.. LUN","yiwern5":"CS2103T-T14-1 TSUI..WERN","ziyi22":"CS2103T-T14-1 YEO ..I YI","howen02":"CS2103T-T14-1 YAP .. WEN","wolffe88":"CS2103T-T14-1 YONG..I AN"}} +{"authorDailyContributionsMap":{"KiatLun":[],"yiwern5":[{"date":"2024-02-26","commitResults":[{"hash":"6f56dc07d867733f444ba907d97d818fb135ef56","isMergeCommit":false,"messageTitle":"Configure MarkBind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"cd676177dcfec166a93be5b66897d883194aa9d0","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T14-1/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"49f56bf1f16bc1b4f9b45fab550e3193cf15deee","isMergeCommit":false,"messageTitle":"Adding Command","messageBody":"Tutorial\n","fileTypesAndContributionMap":{"functional-code":{"insertions":314,"deletions":118},"test-code":{"insertions":169,"deletions":15}}},{"hash":"4768e4fe53a49a57f47be123d799d9ec400714d8","isMergeCommit":false,"messageTitle":"Fix Adding Command","messageBody":"Checkstyle and run tests\n","fileTypesAndContributionMap":{"functional-code":{"insertions":61,"deletions":54},"test-code":{"insertions":135,"deletions":135}}}]},{"date":"2024-03-05","commitResults":[{"hash":"511c44cecc89f2f6718ac05c43a82e68f9c0943a","isMergeCommit":false,"messageTitle":"About Us and DG","messageBody":"Update photo and product name\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]},{"date":"2024-03-06","commitResults":[{"hash":"446b52e4df9e8f787e4d738af25433ea859cb1b8","isMergeCommit":false,"messageTitle":"About Us and Project Website","messageBody":"Update github link and title prefix\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":5}}},{"hash":"66eef5ead03625a386d197d4c9e6868cb75914eb","isMergeCommit":true,"messageTitle":"About Us and Project Website","messageBody":"About Us and Project Website","fileTypesAndContributionMap":{}}]}],"ziyi22":[],"howen02":[{"date":"2024-03-05","commitResults":[{"hash":"835e0ad385ba8724647dcff810f1d4317b343ca7","isMergeCommit":true,"messageTitle":"Merge pull request #22 from yiwern5/yiwern-pw","messageBody":"Yi Wern About Us","fileTypesAndContributionMap":{}},{"hash":"4a4a2b6c4c514394b93d33b28d45e0dda177cec3","isMergeCommit":false,"messageTitle":"Revert \"Fix Adding Command\"","messageBody":"This reverts commit 4768e4fe53a49a57f47be123d799d9ec400714d8.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":54,"deletions":61},"test-code":{"insertions":135,"deletions":135}}},{"hash":"8e2519485cab2974d15edf2d0b22ff7a1375f4ee","isMergeCommit":false,"messageTitle":"Revert \"Adding Command\"","messageBody":"This reverts commit 49f56bf1f16bc1b4f9b45fab550e3193cf15deee.\n","fileTypesAndContributionMap":{"functional-code":{"insertions":118,"deletions":314},"test-code":{"insertions":15,"deletions":169}}},{"hash":"7f2858d449394b63e01b1bd4337dd8359ccff147","isMergeCommit":true,"messageTitle":"Merge pull request #24 from howen02/master","messageBody":"Undo tutorial pull request","fileTypesAndContributionMap":{}}]}],"wolffe88":[]},"authorFileTypeContributionMap":{"KiatLun":{"docs":0,"functional-code":0,"test-code":0},"yiwern5":{"docs":7,"functional-code":0,"test-code":0},"ziyi22":{"docs":0,"functional-code":0,"test-code":0},"howen02":{"docs":0,"functional-code":0,"test-code":0},"wolffe88":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"KiatLun":0.0,"yiwern5":70900.83,"ziyi22":0.0,"howen02":71148.0,"wolffe88":0.0},"authorDisplayNameMap":{"KiatLun":"CS2103T-T14-1 KHOO.. LUN","yiwern5":"CS2103T-T14-1 TSUI..WERN","ziyi22":"CS2103T-T14-1 YEO ..I YI","howen02":"CS2103T-T14-1 YAP .. WEN","wolffe88":"CS2103T-T14-1 YONG..I AN"}} diff --git a/AY2324S2-CS2103T-T15-2_tp_master/authorship.json b/AY2324S2-CS2103T-T15-2_tp_master/authorship.json index 11bf57ea..6b5b3940 100644 --- a/AY2324S2-CS2103T-T15-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T15-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: 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":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":353,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":363,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":364,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"RingoftheKing":16,"-":392}},{"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":"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":"\u003eFormat: `view`","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"cheahTJ"},"content":"#### Add New Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `id/NUSID n/NAME p/PHONE [e/EMAIL] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"cheahTJ"},"content":"#### Edit Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `edit id/NUSID [n/NEWNAME] [p/NEWPHONE] [e/NEWEMAIL]`","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"cheahTJ"},"content":"#### Delete Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `delete id/NUSID`","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"cheahTJ"},"content":"#### Filtering Existing Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `filter [n/NAME] [p/PHONE] [e/EMAIL] [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"cheahTJ"},"content":"#### Assign contacts a tutorial group","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `assign id/NUSID [g/GROUP] [t/TAG]`","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"cheahTJ"},"content":"#### Add Schedule","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"cheahTJ"},"content":"\u003eFormat: `schedule id/NUSID d/DATE from/FROM [to/TO] [t/TAG] [r/REMARK]`","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"cheahTJ"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"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":39,"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":32,"-":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":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"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":348,"author":{"gitId":"hjuntan"},"content":"5. The system should respond within two seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"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":350,"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":351,"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":352,"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":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":357,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":367,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":368,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"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":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"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":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"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":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"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":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"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":402,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"RingoftheKing":16,"hjuntan":6,"-":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":"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}}] diff --git a/AY2324S2-CS2103T-T15-2_tp_master/commits.json b/AY2324S2-CS2103T-T15-2_tp_master/commits.json index c5c7eefd..9e1966cc 100644 --- a/AY2324S2-CS2103T-T15-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T15-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"cheahTJ":[],"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":{}}]}],"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":[],"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":{}}]}]},"authorFileTypeContributionMap":{"cheahTJ":{"docs":0,"functional-code":0,"test-code":0},"Rikko1204":{"docs":1,"functional-code":0,"test-code":0},"RingoftheKing":{"docs":16,"functional-code":0,"test-code":0},"Ragnapop":{"docs":0,"functional-code":0,"test-code":0},"hjuntan":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"cheahTJ":0.0,"Rikko1204":0.30555552,"RingoftheKing":68.75,"Ragnapop":0.0,"hjuntan":0.0},"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}}}]}],"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":{}}]}],"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":[],"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":{}}]}]},"authorFileTypeContributionMap":{"cheahTJ":{"docs":305,"functional-code":0,"test-code":0},"Rikko1204":{"docs":1,"functional-code":0,"test-code":0},"RingoftheKing":{"docs":16,"functional-code":0,"test-code":0},"Ragnapop":{"docs":0,"functional-code":0,"test-code":0},"hjuntan":{"docs":6,"functional-code":0,"test-code":0}},"authorContributionVariance":{"cheahTJ":8459.313,"Rikko1204":0.2840236,"RingoftheKing":63.90533,"Ragnapop":0.0,"hjuntan":4.5443788},"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-3_tp_master/authorship.json b/AY2324S2-CS2103T-T15-3_tp_master/authorship.json index acdc09f3..82149322 100644 --- a/AY2324S2-CS2103T-T15-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T15-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"triciiaaa"},"content":"## Project Team","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"triciiaaa"},"content":"### Brenna Tan","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"triciiaaa"},"content":"\u003cimg src\u003d\"images/brennalaurentan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"triciiaaa"},"content":"[[github](http://github.com/brennalaurentan)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"triciiaaa"},"content":"* Responsibilities: Backend for Birthday information","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"triciiaaa"},"content":"### Shaun Lai","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"triciiaaa"},"content":"\u003cimg src\u003d\"images/casaarlai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"triciiaaa"},"content":"[[github](http://github.com/casaarlai)]","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"triciiaaa"},"content":"* Responsibilities: Backend for Attendance feature","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"triciiaaa"},"content":"### Tricia Ang","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"triciiaaa"},"content":"\u003cimg src\u003d\"images/triciiaaa.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"triciiaaa"},"content":"[[github](http://github.com/triciiaaa)]","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"triciiaaa"},"content":"* Responsibilities: UI Design","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"triciiaaa":13,"-":26}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"triciiaaa"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-3/tp/actions)","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"triciiaaa"},"content":"# BandBook","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"triciiaaa"},"content":"BandBook is your all-in-one software designed to streamline the management of band members\u0027 contact details and ","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"triciiaaa"},"content":"information. It offers a user-friendly platform to **create, edit and delete** members\u0027 contact information, ","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"triciiaaa"},"content":"along with optional fields such as tag and birthday information. ","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"triciiaaa"},"content":"Moreover, you can **indicate and view** the attendance history of your members, ensuring that they stay on track ","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"triciiaaa"},"content":"with the band\u0027s activities. Optimised for use via a Command Line Interface (CLI), BandBook can assist you in ","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"triciiaaa"},"content":"managing your members\u0027 details faster than traditional GUI apps.","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"triciiaaa"},"content":"\u003cp align\u003d\"center\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"triciiaaa"},"content":" \u003cimg src\u003d\"docs/images/Ui.png\" alt\u003d\"Description of the image\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"triciiaaa"},"content":"\u003c/p\u003e ","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"triciiaaa"},"content":"## Features","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"triciiaaa"},"content":"### Creating Contact Information","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"triciiaaa"},"content":"Creates and adds a band member\u0027s contact into the list of contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"triciiaaa"},"content":"Command Syntax: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG] [b/BIRTHDAY] ...`","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"triciiaaa"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"triciiaaa"},"content":"- `add n/John Doe p/98765432 e/johnd@example.com a/John Street, block 123, #01-01`","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"triciiaaa"},"content":"- `add n/Sally Smith p/92716291 e/sallys@example.com a/Sally Street, block 221, #12-25 b/2000-01-01`","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"triciiaaa"},"content":"### Updating Contact Information","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"triciiaaa"},"content":"Updates a band member\u0027s contact with newly provided information.","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"triciiaaa"},"content":"Command Syntax: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG] [b/BIRTHDAY] ...`","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"triciiaaa"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"triciiaaa"},"content":"- `edit 1 p/91234567 e/johndoe@example.com `","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"triciiaaa"},"content":"- `edit 2 p/92712213 b/2001-02-03`","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"triciiaaa"},"content":"### Deleting Contact Information","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"triciiaaa"},"content":"Deletes a band member\u0027s contact from the list of contacts.","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"triciiaaa"},"content":"Command Syntax: `delete INDEX`","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"triciiaaa"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"triciiaaa"},"content":"- `delete 2` deletes the user with id \u003d 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"triciiaaa"},"content":"### Viewing Upcoming Birthdays","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"triciiaaa"},"content":"Displays X number of upcoming birthdays.","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"triciiaaa"},"content":"Command Syntax: `bd NUM`","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"triciiaaa"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"triciiaaa"},"content":"- `bd 3` displays the 3 upcoming birthdays from today\u0027s date.","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"triciiaaa"},"content":"### Updating Attendance History","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"triciiaaa"},"content":"Adds the date of session attended by a band member to his/her attendance list.","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"triciiaaa"},"content":"Command Syntax: `att mark INDEX d/DATE`","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"triciiaaa"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"triciiaaa"},"content":"- `att mark 2 d/2024-10-19`","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"triciiaaa"},"content":"### Viewing Attendance History","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"triciiaaa"},"content":"Displays the attendance history of a specific band member.","lastModifiedDate":"2024-03-04"},{"lineNumber":63,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"triciiaaa"},"content":"Command Syntax: `att view INDEX`","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":66,"author":{"gitId":"triciiaaa"},"content":"Examples:","lastModifiedDate":"2024-03-04"},{"lineNumber":67,"author":{"gitId":"triciiaaa"},"content":"- `att view 2`","lastModifiedDate":"2024-03-04"},{"lineNumber":68,"author":{"gitId":"triciiaaa"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":69,"author":{"gitId":"triciiaaa"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"triciiaaa":69}},{"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":"triciiaaa"},"content":"## Project Team","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"triciiaaa"},"content":"### Brenna Tan","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"triciiaaa"},"content":"\u003cimg src\u003d\"images/brennalaurentan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"triciiaaa"},"content":"[[github](http://github.com/brennalaurentan)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"triciiaaa"},"content":"* Responsibilities: Backend for Birthday information","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"triciiaaa"},"content":"### Shaun Lai","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"triciiaaa"},"content":"\u003cimg src\u003d\"images/casaarlai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"triciiaaa"},"content":"[[github](http://github.com/casaarlai)]","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"triciiaaa"},"content":"* Responsibilities: Backend for Attendance feature","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"triciiaaa"},"content":"### Tricia Ang","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"triciiaaa"},"content":"\u003cimg src\u003d\"images/triciiaaa.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"triciiaaa"},"content":"[[github](http://github.com/triciiaaa)]","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"triciiaaa"},"content":"* Responsibilities: UI Design","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"triciiaaa":13,"-":26}}] diff --git a/AY2324S2-CS2103T-T15-3_tp_master/commits.json b/AY2324S2-CS2103T-T15-3_tp_master/commits.json index 1f17a9e7..243dddcf 100644 --- a/AY2324S2-CS2103T-T15-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T15-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"casaarlai":[],"triciiaaa":[{"date":"2024-03-04","commitResults":[{"hash":"8421c25470798a1c07ba963c0817249e1f74bd69","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":36}}},{"hash":"2d3140d368e1ebf8342552b21d9088caffdf6fce","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-aboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"634e74698b55ff6044bfffa3b2804809b0a6004e","isMergeCommit":false,"messageTitle":"Fix CI Error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e1af4d7ed468ab03a5379c3bfe4dce178f3321e6","isMergeCommit":true,"messageTitle":"Merge pull request #11 from triciiaaa/master","messageBody":"Update About Us Page","fileTypesAndContributionMap":{}}]}],"brennalaurentan":[]},"authorFileTypeContributionMap":{"casaarlai":{"docs":0,"functional-code":0,"test-code":0},"triciiaaa":{"docs":13,"functional-code":0,"test-code":0},"brennalaurentan":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"casaarlai":0.0,"triciiaaa":223.47108,"brennalaurentan":0.0},"authorDisplayNameMap":{"casaarlai":"CS2103T-T15-3 LAI ..HAUN","triciiaaa":"CS2103T-T15-3 TRIC..N EE","brennalaurentan":"CS2103T-T15-3 BREN.. ERN"}} +{"authorDailyContributionsMap":{"casaarlai":[],"triciiaaa":[{"date":"2024-03-04","commitResults":[{"hash":"8421c25470798a1c07ba963c0817249e1f74bd69","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":36}}},{"hash":"2d3140d368e1ebf8342552b21d9088caffdf6fce","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-aboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"634e74698b55ff6044bfffa3b2804809b0a6004e","isMergeCommit":false,"messageTitle":"Fix CI Error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e1af4d7ed468ab03a5379c3bfe4dce178f3321e6","isMergeCommit":true,"messageTitle":"Merge pull request #11 from triciiaaa/master","messageBody":"Update About Us Page","fileTypesAndContributionMap":{}},{"hash":"ca4b7b1f719c3f8aa40df56f5c502a657d0f2690","isMergeCommit":false,"messageTitle":"Update README page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":69,"deletions":14}}},{"hash":"8408f6eb6952c687465c1195389b823323c24aec","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-README\u0027","messageBody":"","fileTypesAndContributionMap":{}}]}],"brennalaurentan":[{"date":"2024-03-06","commitResults":[{"hash":"23b9ce8515948f7e9f5a5bff886f4b19c0194805","isMergeCommit":true,"messageTitle":"Merge pull request #13 from triciiaaa/master","messageBody":"Update README page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"casaarlai":{"docs":0,"functional-code":0,"test-code":0},"triciiaaa":{"docs":82,"functional-code":0,"test-code":0},"brennalaurentan":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"casaarlai":0.0,"triciiaaa":1294.0828,"brennalaurentan":0.0},"authorDisplayNameMap":{"casaarlai":"CS2103T-T15-3 LAI ..HAUN","triciiaaa":"CS2103T-T15-3 TRIC..N EE","brennalaurentan":"CS2103T-T15-3 BREN.. ERN"}} diff --git a/AY2324S2-CS2103T-T15-4_tp_master/authorship.json b/AY2324S2-CS2103T-T15-4_tp_master/authorship.json index a2966460..44ef5e0a 100644 --- a/AY2324S2-CS2103T-T15-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T15-4_tp_master/authorship.json @@ -1 +1 @@ -[{"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":"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":"-"},"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":"BryanL2303"},"content":"|----------| ------------------------------------------ |----------------------------------------------|-------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | add a new person | keep a person on record |","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all recorded persons | locate details of all persons in a list |","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | add a new task | keep upcoming tasks on record |","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | delete a task | remove entries that I no longer need |","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | list all recorded tasks | locate details of all tasks in a list |","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"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":288,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | unassign a person from a task | update changes in manpower allocation |","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"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":290,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | mark a task as done | keep track of task completion |","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | unmark a marked task | undo wrongly marked tasks |","lastModifiedDate":"2024-03-05"},{"lineNumber":292,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | save current data | keep track of all data even after exiting |","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"BryanL2303"},"content":"| `* * *` | user | load saved data | use the data that was saved previously |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"BryanL2303"},"content":"*{More to be added for v1.3}*","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"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":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of persons with their ids","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"BryanL2303"},"content":"3. User requests to delete a specific person in the list by their id","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro deletes the person","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"BryanL2303"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"BryanL2303"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"BryanL2303"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"BryanL2303"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"BryanL2303"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"BryanL2303"},"content":"**Use case: Delete a task**","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"BryanL2303"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"BryanL2303"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-05"},{"lineNumber":330,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of tasks with their ids","lastModifiedDate":"2024-03-05"},{"lineNumber":331,"author":{"gitId":"BryanL2303"},"content":"3. User requests to delete a specific task in the list by their id","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro deletes the task","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"BryanL2303"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"BryanL2303"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"BryanL2303"},"content":"**Use case: Assign/unassign a person to a task**","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"BryanL2303"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"BryanL2303"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"BryanL2303"},"content":"2. TaskMasterPro shows a list of persons with their ids ","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"BryanL2303"},"content":"3. User requests to list tasks ","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"BryanL2303"},"content":"4. TaskMasterPro shows a list of tasks with their ids ","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"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":357,"author":{"gitId":"BryanL2303"},"content":"6. TaskMasterPro assigns/un-assigns the person to the task","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"BryanL2303"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"BryanL2303"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"BryanL2303"},"content":"* 4a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"BryanL2303"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"BryanL2303"},"content":"* 5a. Any given id is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"BryanL2303"},"content":" * 5a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"BryanL2303"},"content":" Use case resumes at step 2/4.","lastModifiedDate":"2024-03-05"},{"lineNumber":376,"author":{"gitId":"BryanL2303"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":377,"author":{"gitId":"gavin331"},"content":"**Use case: Mark/unmark a task as done/not done**","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"gavin331"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"gavin331"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"gavin331"},"content":"1. User requests to list tasks","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"gavin331"},"content":"2. TaskMasterPro shows a list of tasks with their ids","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"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":384,"author":{"gitId":"gavin331"},"content":"4. TaskMasterPro marks/unmarks that task as done/not done.","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":388,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"gavin331"},"content":"* 3a. The given id is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":396,"author":{"gitId":"gavin331"},"content":" * 3a1. TaskMasterPro shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":400,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"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":405,"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":406,"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":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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"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":422,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"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":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"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":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"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":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"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":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"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":456,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"BryanL2303":73,"gavin331":10,"-":383}},{"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}}] diff --git a/AY2324S2-CS2103T-T15-4_tp_master/commits.json b/AY2324S2-CS2103T-T15-4_tp_master/commits.json index 58ceaa69..520093a8 100644 --- a/AY2324S2-CS2103T-T15-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-T15-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"BryanL2303":[],"azumieflare":[],"gavin331":[],"johnyoozhengxian":[]},"authorFileTypeContributionMap":{"BryanL2303":{"docs":0,"functional-code":0,"test-code":0,"other":1},"azumieflare":{"docs":0,"functional-code":0,"test-code":0},"gavin331":{"docs":0,"functional-code":0,"test-code":0},"johnyoozhengxian":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"BryanL2303":0.0,"azumieflare":0.0,"gavin331":0.0,"johnyoozhengxian":0.0},"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}}}]},{"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":"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":{}}]}],"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":"5ffd3a754edbce36809a124db2e2aa4d8e2e151a","isMergeCommit":true,"messageTitle":"Merge pull request #30 from AY2324S2-CS2103T-T15-4/8-update-dg","messageBody":"Close DG for v1.1","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":{}}]},{"date":"2024-03-06","commitResults":[{"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}}}]}],"johnyoozhengxian":[{"date":"2024-03-06","commitResults":[{"hash":"f0055421a56a53954ec4cf42f72fb17046e06401","isMergeCommit":false,"messageTitle":"Add AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}},{"hash":"f79813bb662d879ef9fb37c0bb5c0e4cfd4fe2bd","isMergeCommit":true,"messageTitle":"Merge branch \u00271-update-aboutus-page\u0027 into update-aboutus-page","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c0e02c3ffa515310761697163248f75498898d3b","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"BryanL2303":{"docs":122,"functional-code":0,"test-code":0,"other":1},"azumieflare":{"docs":114,"functional-code":0,"test-code":0},"gavin331":{"docs":62,"functional-code":0,"test-code":0},"johnyoozhengxian":{"docs":50,"functional-code":0,"test-code":0}},"authorContributionVariance":{"BryanL2303":977.62134,"azumieflare":11247.621,"gavin331":347.3846,"johnyoozhengxian":238.86388},"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-T17-3_tp_master/authorship.json b/AY2324S2-CS2103T-T17-3_tp_master/authorship.json index 679b240a..d8e8afa7 100644 --- a/AY2324S2-CS2103T-T17-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T17-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: 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":"dillontkh"},"content":"## ClickConnect","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"ruijietay"},"content":"### Tan Kah Ho Dillon","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"dillontkh"},"content":"\u003cimg src\u003d\"images/dillontkh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"dillontkh"},"content":"[[github](https://github.com/dillontkh)]","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"ruijietay"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"dillontkh"},"content":"* Responsibilities: Overall project coordination.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"ruijietay"},"content":"### Baskar Gopinath","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"ruijietay"},"content":"* Role: Developer","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ruijietay"},"content":"### Ng Wei Han, Ryan","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"ruijietay"},"content":"### Chee Jing Jie","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"ruijietay"},"content":"### Tay Rui-Jie","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"ruijietay"},"content":"\u003cimg src\u003d\"images/ruijietay.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"ruijietay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"ruijietay"},"content":"[[github](http://github.com/ruijietay)]","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"ruijietay"},"content":"[[linkedin](https://www.linkedin.com/in/tayruijie/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"ruijietay":15,"-":43,"dillontkh":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":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"dillontkh"},"content":" original source as well}","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"dillontkh"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"dillontkh"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"dillontkh"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"dillontkh"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"dillontkh"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"dillontkh"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-05"},{"lineNumber":71,"author":{"gitId":"dillontkh"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"dillontkh"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"dillontkh"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"dillontkh"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"dillontkh"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"dillontkh"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"dillontkh"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"dillontkh"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-05"},{"lineNumber":92,"author":{"gitId":"dillontkh"},"content":"visible GUI.","lastModifiedDate":"2024-03-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":95,"author":{"gitId":"dillontkh"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"dillontkh"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"dillontkh"},"content":"is specified","lastModifiedDate":"2024-03-05"},{"lineNumber":98,"author":{"gitId":"dillontkh"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"**API","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"dillontkh"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-05"},{"lineNumber":117,"author":{"gitId":"dillontkh"},"content":"call as an example.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"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-05"},{"lineNumber":127,"author":{"gitId":"dillontkh"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":128,"author":{"gitId":"dillontkh"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"dillontkh"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"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-05"},{"lineNumber":132,"author":{"gitId":"dillontkh"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"dillontkh"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"dillontkh"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-05"},{"lineNumber":143,"author":{"gitId":"dillontkh"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-05"},{"lineNumber":144,"author":{"gitId":"dillontkh"},"content":" a `Command` object.","lastModifiedDate":"2024-03-05"},{"lineNumber":145,"author":{"gitId":"dillontkh"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-05"},{"lineNumber":146,"author":{"gitId":"dillontkh"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-05"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"dillontkh"},"content":"**API","lastModifiedDate":"2024-03-05"},{"lineNumber":151,"author":{"gitId":"dillontkh"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-05"},{"lineNumber":160,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":161,"author":{"gitId":"dillontkh"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"dillontkh"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"dillontkh"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":164,"author":{"gitId":"dillontkh"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-05"},{"lineNumber":165,"author":{"gitId":"dillontkh"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"**API","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"dillontkh"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":182,"author":{"gitId":"dillontkh"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-05"},{"lineNumber":183,"author":{"gitId":"dillontkh"},"content":" objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":184,"author":{"gitId":"dillontkh"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-05"},{"lineNumber":185,"author":{"gitId":"dillontkh"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-05"},{"lineNumber":186,"author":{"gitId":"dillontkh"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-05"},{"lineNumber":187,"author":{"gitId":"dillontkh"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-05"},{"lineNumber":204,"author":{"gitId":"dillontkh"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-05"},{"lineNumber":205,"author":{"gitId":"dillontkh"},"content":"following operations:","lastModifiedDate":"2024-03-05"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"dillontkh"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"dillontkh"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"dillontkh"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"dillontkh"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-05"},{"lineNumber":212,"author":{"gitId":"dillontkh"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-05"},{"lineNumber":217,"author":{"gitId":"dillontkh"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-05"},{"lineNumber":222,"author":{"gitId":"dillontkh"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-05"},{"lineNumber":223,"author":{"gitId":"dillontkh"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-05"},{"lineNumber":224,"author":{"gitId":"dillontkh"},"content":"state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-05"},{"lineNumber":229,"author":{"gitId":"dillontkh"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-05"},{"lineNumber":230,"author":{"gitId":"dillontkh"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"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-05"},{"lineNumber":239,"author":{"gitId":"dillontkh"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-05"},{"lineNumber":240,"author":{"gitId":"dillontkh"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-05"},{"lineNumber":262,"author":{"gitId":"dillontkh"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-05"},{"lineNumber":269,"author":{"gitId":"dillontkh"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-05"},{"lineNumber":270,"author":{"gitId":"dillontkh"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-05"},{"lineNumber":275,"author":{"gitId":"dillontkh"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-05"},{"lineNumber":276,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":277,"author":{"gitId":"dillontkh"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"|----------|-----------------------------------------------|--------------------------------------------|----------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | add a client name and phone number | quickly take down contact details even in a rush. |","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | delete contact | remove them once I\u0027m done dealing with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | display all contacts | I can see all my clients at a glance. |","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | add a note for each contact | store additional information associated with the client |","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"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":343,"author":{"gitId":"ruijietay"},"content":"| `* * *` | user with many contacts in the address book | search for contacts by their name | retrieve that contact\u0027s information |","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"dillontkh"},"content":"| `* *` | user | add a picture to my contacts | easily identify my contacts and add a personal touch to them |","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"dillontkh"},"content":"| `* *` | user | update a person\u0027s contact information | keep my address book relevant and up-to-date |","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"dillontkh"},"content":"| `*` | user who has completed dealings with a client | archive contacts | remove them from the contact list but still have their contact information in case I need it |","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"dillontkh"},"content":"| `*` | user with many ongoing projects | filter contacts based on project deadlines | prioritise the clients with approaching deadlines |","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"ruijietay"},"content":"| `*` | user with many persons in the address book | sort contacts by name | locate a person easily |","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"dillontkh"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"dillontkh"},"content":"otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"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":384,"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":385,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":386,"author":{"gitId":"dillontkh"},"content":" able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"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-05"},{"lineNumber":413,"author":{"gitId":"dillontkh"},"content":" optimum.","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"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":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"dillontkh"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"dillontkh"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"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":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"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":438,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ruijietay":2,"-":333,"dillontkh":113}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ruijietay"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T17-3/tp/actions)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"ruijietay"},"content":"# ClickConnect","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"ruijietay"},"content":"ClickConnect is an easy-to-use address book that is geared towards freelance photographers.","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"ruijietay"},"content":"Features such as the integration of a task list for each contact allows photographers","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"ruijietay"},"content":"to effectively track tasks with clients.","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"ruijietay"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ruijietay"},"content":"The main way to interact with ClickConnect is via the keyboard. This allows photographers to quickly manage","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"ruijietay"},"content":"their clients, while still having a GUI that provides a visually pleasing experience to the user.","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"ruijietay"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"ruijietay"},"content":"* For the detailed documentation of this project, see the **[ClickConnect Product Website](https://ay2324s2-cs2103t-t17-3.github.io/tp/)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"ruijietay"},"content":"* This project is based on the [AddressBook-Level3](https://github.com/se-edu/addressbook-level3) project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"ruijietay":11,"-":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":"dillontkh"},"content":"## ClickConnect","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"ruijietay"},"content":"### Tan Kah Ho Dillon","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"dillontkh"},"content":"\u003cimg src\u003d\"images/dillontkh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"dillontkh"},"content":"[[github](https://github.com/dillontkh)]","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"ruijietay"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"dillontkh"},"content":"* Responsibilities: Overall project coordination.","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"ruijietay"},"content":"### Baskar Gopinath","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"ruijietay"},"content":"* Role: Developer","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ruijietay"},"content":"### Ng Wei Han, Ryan","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"ruijietay"},"content":"### Chee Jing Jie","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"ruijietay"},"content":"### Tay Rui-Jie","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"ruijietay"},"content":"\u003cimg src\u003d\"images/ruijietay.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"ruijietay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"ruijietay"},"content":"[[github](http://github.com/ruijietay)]","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"ruijietay"},"content":"[[linkedin](https://www.linkedin.com/in/tayruijie/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"ruijietay"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"ruijietay":15,"-":43,"dillontkh":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":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"dillontkh"},"content":" original source as well}","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"dillontkh"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"dillontkh"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"dillontkh"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"dillontkh"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"dillontkh"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-05"},{"lineNumber":63,"author":{"gitId":"dillontkh"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-05"},{"lineNumber":71,"author":{"gitId":"dillontkh"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"dillontkh"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"dillontkh"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"dillontkh"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"dillontkh"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"dillontkh"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"dillontkh"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"dillontkh"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-05"},{"lineNumber":92,"author":{"gitId":"dillontkh"},"content":"visible GUI.","lastModifiedDate":"2024-03-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":95,"author":{"gitId":"dillontkh"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"dillontkh"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"dillontkh"},"content":"is specified","lastModifiedDate":"2024-03-05"},{"lineNumber":98,"author":{"gitId":"dillontkh"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"**API","lastModifiedDate":"2024-03-05"},{"lineNumber":110,"author":{"gitId":"dillontkh"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-05"},{"lineNumber":117,"author":{"gitId":"dillontkh"},"content":"call as an example.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"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-05"},{"lineNumber":127,"author":{"gitId":"dillontkh"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":128,"author":{"gitId":"dillontkh"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"dillontkh"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"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-05"},{"lineNumber":132,"author":{"gitId":"dillontkh"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":141,"author":{"gitId":"dillontkh"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-05"},{"lineNumber":142,"author":{"gitId":"dillontkh"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-05"},{"lineNumber":143,"author":{"gitId":"dillontkh"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-05"},{"lineNumber":144,"author":{"gitId":"dillontkh"},"content":" a `Command` object.","lastModifiedDate":"2024-03-05"},{"lineNumber":145,"author":{"gitId":"dillontkh"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-05"},{"lineNumber":146,"author":{"gitId":"dillontkh"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-05"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"dillontkh"},"content":"**API","lastModifiedDate":"2024-03-05"},{"lineNumber":151,"author":{"gitId":"dillontkh"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-05"},{"lineNumber":160,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":161,"author":{"gitId":"dillontkh"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"dillontkh"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"dillontkh"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":164,"author":{"gitId":"dillontkh"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-05"},{"lineNumber":165,"author":{"gitId":"dillontkh"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"**API","lastModifiedDate":"2024-03-05"},{"lineNumber":176,"author":{"gitId":"dillontkh"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":182,"author":{"gitId":"dillontkh"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-05"},{"lineNumber":183,"author":{"gitId":"dillontkh"},"content":" objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":184,"author":{"gitId":"dillontkh"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-05"},{"lineNumber":185,"author":{"gitId":"dillontkh"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-05"},{"lineNumber":186,"author":{"gitId":"dillontkh"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-05"},{"lineNumber":187,"author":{"gitId":"dillontkh"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-05"},{"lineNumber":204,"author":{"gitId":"dillontkh"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-05"},{"lineNumber":205,"author":{"gitId":"dillontkh"},"content":"following operations:","lastModifiedDate":"2024-03-05"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"dillontkh"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"dillontkh"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"dillontkh"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"dillontkh"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-05"},{"lineNumber":212,"author":{"gitId":"dillontkh"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-05"},{"lineNumber":217,"author":{"gitId":"dillontkh"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-05"},{"lineNumber":222,"author":{"gitId":"dillontkh"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-05"},{"lineNumber":223,"author":{"gitId":"dillontkh"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-05"},{"lineNumber":224,"author":{"gitId":"dillontkh"},"content":"state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-05"},{"lineNumber":229,"author":{"gitId":"dillontkh"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-05"},{"lineNumber":230,"author":{"gitId":"dillontkh"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"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-05"},{"lineNumber":239,"author":{"gitId":"dillontkh"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-05"},{"lineNumber":240,"author":{"gitId":"dillontkh"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-05"},{"lineNumber":262,"author":{"gitId":"dillontkh"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-05"},{"lineNumber":269,"author":{"gitId":"dillontkh"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-05"},{"lineNumber":270,"author":{"gitId":"dillontkh"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-05"},{"lineNumber":275,"author":{"gitId":"dillontkh"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-05"},{"lineNumber":276,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":277,"author":{"gitId":"dillontkh"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-05"},{"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":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"ruijietay"},"content":"* prefers typing over mouse interactions (i.e. should be able to type fast)","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"ruijietay"},"content":"* has many clients to manage, with each of them having different requirements","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"ruijietay"},"content":"* is a freelance photographer","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"ruijietay"},"content":"**Value proposition**: The target user is communicating with many clients, who all have different project requirements","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"ruijietay"},"content":"and deadlines. Having some task management capabilities could be beneficial to them. For example, each contact have","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"ruijietay"},"content":"tasks with deadlines, meetings, and other relevant info tagged to them.","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"dillontkh"},"content":"|----------|-----------------------------------------------|--------------------------------------------|----------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | add a client name and phone number | quickly take down contact details even in a rush. |","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | delete contact | remove them once I\u0027m done dealing with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | display all contacts | I can see all my clients at a glance. |","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"dillontkh"},"content":"| `* * *` | user | add a note for each contact | store additional information associated with the client |","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"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":345,"author":{"gitId":"ruijietay"},"content":"| `* * *` | user with many contacts in the address book | search for contacts by their name | retrieve that contact\u0027s information |","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"dillontkh"},"content":"| `* *` | user | add a picture to my contacts | easily identify my contacts and add a personal touch to them |","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"dillontkh"},"content":"| `* *` | user | update a person\u0027s contact information | keep my address book relevant and up-to-date |","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"dillontkh"},"content":"| `*` | user who has completed dealings with a client | archive contacts | remove them from the contact list but still have their contact information in case I need it |","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"dillontkh"},"content":"| `*` | user with many ongoing projects | filter contacts based on project deadlines | prioritise the clients with approaching deadlines |","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"ruijietay"},"content":"| `*` | user with many persons in the address book | sort contacts by name | locate a person easily |","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"dillontkh"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"dillontkh"},"content":"otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"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":386,"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":387,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":388,"author":{"gitId":"dillontkh"},"content":" able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":395,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"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":404,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"dillontkh"},"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-05"},{"lineNumber":415,"author":{"gitId":"dillontkh"},"content":" optimum.","lastModifiedDate":"2024-03-05"},{"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":"dillontkh"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"dillontkh"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-05"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"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":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"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":440,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ruijietay":8,"-":329,"dillontkh":113}}] diff --git a/AY2324S2-CS2103T-T17-3_tp_master/commits.json b/AY2324S2-CS2103T-T17-3_tp_master/commits.json index 848cb015..2c7f4036 100644 --- a/AY2324S2-CS2103T-T17-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T17-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"RyanNgWH":[],"bgopi23":[],"ruijietay":[{"date":"2024-03-04","commitResults":[{"hash":"3253f45ee0f619c992e774a11e3ae15c9e05d7a7","isMergeCommit":false,"messageTitle":"Update AboutUs to add photo for Ruijie","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":11}}}]},{"date":"2024-03-05","commitResults":[{"hash":"b88142fc36d22893edbe0f4814fb65affb82e87e","isMergeCommit":true,"messageTitle":"Merge pull request #14 from dillontkh/branch-UpdateAboutUs-Dillon","messageBody":"Add profile picture for Dillon","fileTypesAndContributionMap":{}},{"hash":"3c2e553467f013506e3a65e5c778352f7e3c2b15","isMergeCommit":false,"messageTitle":"Update user stories for developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}},{"hash":"3f7a2e3139fe5583a488e44ed70a8d230e52a035","isMergeCommit":false,"messageTitle":"Fix typo in user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"328c117aa82ffffb0a29e030466d05cb17bd5d27","isMergeCommit":true,"messageTitle":"Merge pull request #19 from dillontkh/Docs-UpdateUserStories","messageBody":"Update User Stories in the Developer Guide","fileTypesAndContributionMap":{}}]}],"jjchee77":[],"dillontkh":[{"date":"2024-03-04","commitResults":[{"hash":"2aa3e39602736096a4469f1dc44ac60ed9206daf","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ruijietay/branch-UpdateAboutUs-Ruijie","messageBody":"Update AboutUs to add photo for Ruijie","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"91c7e138f73a321f0bc1ffea0fe418d2578e18b9","isMergeCommit":false,"messageTitle":"Add picture for dillon","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":14}}},{"hash":"1f8918afc5a18a898b25a0e4373508f7c8283f7c","isMergeCommit":false,"messageTitle":"Update user stories in the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":137,"deletions":74}}},{"hash":"c78a02e45d59af711dffa3edfb37a5a2073081e0","isMergeCommit":true,"messageTitle":"Merge pull request #18 from ruijietay/Docs-UpdateUserStories","messageBody":"Update user stories for developer guide","fileTypesAndContributionMap":{}},{"hash":"f374f4867fcfeb93fe5877a710823e8e8efbfb5f","isMergeCommit":true,"messageTitle":"Resolve merge conflict","messageBody":"","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"RyanNgWH":{"docs":0,"functional-code":0,"test-code":0},"bgopi23":{"docs":0,"functional-code":0,"test-code":0},"ruijietay":{"docs":17,"functional-code":0,"test-code":0},"jjchee77":{"docs":0,"functional-code":0,"test-code":0},"dillontkh":{"docs":117,"functional-code":0,"test-code":0}},"authorContributionVariance":{"RyanNgWH":0.0,"bgopi23":0.0,"ruijietay":185.40971,"jjchee77":0.0,"dillontkh":4005.91},"authorDisplayNameMap":{"RyanNgWH":"CS2103T-T17-3 NG W..RYAN","bgopi23":"CS2103T-T17-3 BASK..NATH","ruijietay":"CS2103T-T17-3 TAY ..-JIE","jjchee77":"CS2103T-T17-3 CHEE.. JIE","dillontkh":"CS2103T-T17-3 TAN ..LLON"}} +{"authorDailyContributionsMap":{"RyanNgWH":[],"bgopi23":[],"ruijietay":[{"date":"2024-03-04","commitResults":[{"hash":"3253f45ee0f619c992e774a11e3ae15c9e05d7a7","isMergeCommit":false,"messageTitle":"Update AboutUs to add photo for Ruijie","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":11}}}]},{"date":"2024-03-05","commitResults":[{"hash":"b88142fc36d22893edbe0f4814fb65affb82e87e","isMergeCommit":true,"messageTitle":"Merge pull request #14 from dillontkh/branch-UpdateAboutUs-Dillon","messageBody":"Add profile picture for Dillon","fileTypesAndContributionMap":{}},{"hash":"35e6bf8531e0c9f84ea776b15fd028e6af4a3845","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}},{"hash":"193ba43e1de3f6183890b94a492bf62b4d0142b8","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"df390cfa6a0027262e37bd2c287642618fa29275","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"3c2e553467f013506e3a65e5c778352f7e3c2b15","isMergeCommit":false,"messageTitle":"Update user stories for developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}},{"hash":"3f7a2e3139fe5583a488e44ed70a8d230e52a035","isMergeCommit":false,"messageTitle":"Fix typo in user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"328c117aa82ffffb0a29e030466d05cb17bd5d27","isMergeCommit":true,"messageTitle":"Merge pull request #19 from dillontkh/Docs-UpdateUserStories","messageBody":"Update User Stories in the Developer Guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"7b85c8df212c3bea5d356fda896ef8163185950f","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Add link back to original project repository\n\nCo-authored-by: Ryan Ng \u003cryan.ng.dev@tinynamoo.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7fa21ca74314962b662b1cb2cfb790d4628eb635","isMergeCommit":false,"messageTitle":"Update product scope of developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}}]}],"jjchee77":[],"dillontkh":[{"date":"2024-03-04","commitResults":[{"hash":"2aa3e39602736096a4469f1dc44ac60ed9206daf","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ruijietay/branch-UpdateAboutUs-Ruijie","messageBody":"Update AboutUs to add photo for Ruijie","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"91c7e138f73a321f0bc1ffea0fe418d2578e18b9","isMergeCommit":false,"messageTitle":"Add picture for dillon","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":14}}},{"hash":"1f8918afc5a18a898b25a0e4373508f7c8283f7c","isMergeCommit":false,"messageTitle":"Update user stories in the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":137,"deletions":74}}},{"hash":"c78a02e45d59af711dffa3edfb37a5a2073081e0","isMergeCommit":true,"messageTitle":"Merge pull request #18 from ruijietay/Docs-UpdateUserStories","messageBody":"Update user stories for developer guide","fileTypesAndContributionMap":{}},{"hash":"f374f4867fcfeb93fe5877a710823e8e8efbfb5f","isMergeCommit":true,"messageTitle":"Resolve merge conflict","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"9c2698452a602c9f89533736c439b24b4532be0f","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ruijietay/Docs-UpdateREADME","messageBody":"Update README","fileTypesAndContributionMap":{}},{"hash":"2a9332fc9b81bc1584119cc49013e3f87b4d310a","isMergeCommit":true,"messageTitle":"Merge pull request #22 from ruijietay/Docs-UpdateProductScope","messageBody":"Update product scope of developer guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"RyanNgWH":{"docs":0,"functional-code":0,"test-code":0},"bgopi23":{"docs":0,"functional-code":0,"test-code":0},"ruijietay":{"docs":34,"functional-code":0,"test-code":0},"jjchee77":{"docs":0,"functional-code":0,"test-code":0},"dillontkh":{"docs":117,"functional-code":0,"test-code":0}},"authorContributionVariance":{"RyanNgWH":0.0,"bgopi23":0.0,"ruijietay":347.4793,"jjchee77":0.0,"dillontkh":3723.621},"authorDisplayNameMap":{"RyanNgWH":"CS2103T-T17-3 NG W..RYAN","bgopi23":"CS2103T-T17-3 BASK..NATH","ruijietay":"CS2103T-T17-3 TAY ..-JIE","jjchee77":"CS2103T-T17-3 CHEE.. JIE","dillontkh":"CS2103T-T17-3 TAN ..LLON"}} diff --git a/AY2324S2-CS2103T-W08-2_tp_master/authorship.json b/AY2324S2-CS2103T-W08-2_tp_master/authorship.json index 9576b548..c9fa30d5 100644 --- a/AY2324S2-CS2103T-W08-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W08-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MaYuehan"},"content":"# VitalConnect","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"MaYuehan"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W08-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W08-2/tp/actions)","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"MaYuehan"},"content":"This product is for clinic assistants that have to keep track of a lot of patient information and requires ","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"MaYuehan"},"content":"the information at a fast pace, thus preferring to have a simple UI such as a CLI instead of a complex GUI, ","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"MaYuehan"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"MaYuehan"},"content":"__Value proposition:__","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"MaYuehan"},"content":"Clinic assistants are required to take note of a multitude of information regarding the patient, ","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"MaYuehan"},"content":"such as their contact number, any existing medical condition, the specific treatment that they are currently undergoing and much more. ","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"MaYuehan"},"content":"With this product, such information will be readily available while also allowing for quality of life features such as scheduling ","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"MaYuehan"},"content":"appointments and managing medication.","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"MaYuehan"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"MaYuehan"},"content":"## Features (V1.2)","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"MaYuehan"},"content":"__Saving the data__","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"MaYuehan"},"content":"* All data is saved in the hard disk automatically after any command that changes the data.","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"MaYuehan"},"content":"__Clear all existing entries__","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"MaYuehan"},"content":"* Clear all the existing entries within the local database.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"MaYuehan"},"content":"__Exit the program__","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"MaYuehan"},"content":"* Exits the program. Any data that is not saved cannot be restored upon exiting.","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"MaYuehan"},"content":"__Viewing help__","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"MaYuehan"},"content":"* Shows a message explaining the instructions to access the user guide.","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"MaYuehan"},"content":"### Manage Appointments","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"MaYuehan"},"content":"__Create Appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"MaYuehan"},"content":"* Create an appointment of a patient, information such as time and name of patient are required when adding.","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"MaYuehan"},"content":"__Delete Appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"MaYuehan"},"content":"* Delete an appointment of a patient.","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"MaYuehan"},"content":"__List Appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"MaYuehan"},"content":"* List all the appointments that have been created, provide information such as the patient’s name and time of the appointments.","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"MaYuehan"},"content":"### Manage Contact Information","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"MaYuehan"},"content":"__Add patient contact information__","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"MaYuehan"},"content":"* Add contact information, including phone number and email address. If a specific field already exists, the command would fail.","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"MaYuehan"},"content":"__Delete patient contact information__","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"MaYuehan"},"content":"* Delete specific or all contact information, including phone number and email address.","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"MaYuehan"},"content":"__List patient contact information__","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"MaYuehan"},"content":"* List all patient’s contact information.","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"MaYuehan"},"content":"### Manage Patients","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"MaYuehan"},"content":"__Add patient__","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"MaYuehan"},"content":"* Add a new patient to the database so further information about their appointment or contact information can be added.","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"MaYuehan"},"content":"__Delete patient__","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"MaYuehan"},"content":"* Delete specific or all patients, including their contact and appointment.","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"MaYuehan":79,"-":3}},{"path":"bin/main/view/CommandBox.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.TextField?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003cStackPane styleClass\u003d\"stack-pane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" \u003cTextField fx:id\u003d\"commandTextField\" onAction\u003d\"#handleCommandEntered\" promptText\u003d\"Enter command here...\"/\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":9}},{"path":"bin/main/view/DarkTheme.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":".background {","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":" background-color: #383838; /* Used in the default.html file */","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":".label {","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #555555;","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":".label-bright {","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":".label-header {","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 32pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":".text-field {","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 12pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":".tab-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":".tab-pane .tab-header-area {","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":" -fx-min-height: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":" -fx-max-height: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":".table-view {","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"Ella-e"},"content":" -fx-base: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":" -fx-control-inner-background: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"Ella-e"},"content":" -fx-table-cell-border-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"Ella-e"},"content":" -fx-table-header-border-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 5;","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"Ella-e"},"content":".table-view .column-header-background {","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"Ella-e"},"content":".table-view .column-header, .table-view .filler {","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"Ella-e"},"content":" -fx-size: 35;","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 0 0 1 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"Ella-e"},"content":" -fx-border-color:","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"Ella-e"},"content":" transparent","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"Ella-e"},"content":" transparent","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"Ella-e"},"content":" derive(-fx-base, 80%)","lastModifiedDate":"2024-03-04"},{"lineNumber":63,"author":{"gitId":"Ella-e"},"content":" transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"Ella-e"},"content":" -fx-border-insets: 0 10 1 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":66,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":67,"author":{"gitId":"Ella-e"},"content":".table-view .column-header .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":68,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 20pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":69,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":70,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":71,"author":{"gitId":"Ella-e"},"content":" -fx-alignment: center-left;","lastModifiedDate":"2024-03-04"},{"lineNumber":72,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":73,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":74,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":75,"author":{"gitId":"Ella-e"},"content":".table-view:focused .table-row-cell:filled:focused:selected {","lastModifiedDate":"2024-03-04"},{"lineNumber":76,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-03-04"},{"lineNumber":77,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":78,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":79,"author":{"gitId":"Ella-e"},"content":".split-pane:horizontal .split-pane-divider {","lastModifiedDate":"2024-03-04"},{"lineNumber":80,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":81,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: transparent transparent transparent #4d4d4d;","lastModifiedDate":"2024-03-04"},{"lineNumber":82,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":83,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":84,"author":{"gitId":"Ella-e"},"content":".split-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":85,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":86,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":87,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":88,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":89,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":90,"author":{"gitId":"Ella-e"},"content":".list-view {","lastModifiedDate":"2024-03-04"},{"lineNumber":91,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":92,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":93,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":94,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":95,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":96,"author":{"gitId":"Ella-e"},"content":".list-cell {","lastModifiedDate":"2024-03-04"},{"lineNumber":97,"author":{"gitId":"Ella-e"},"content":" -fx-label-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":98,"author":{"gitId":"Ella-e"},"content":" -fx-graphic-text-gap : 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":99,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":100,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":101,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":102,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:even {","lastModifiedDate":"2024-03-04"},{"lineNumber":103,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #3c3e3f;","lastModifiedDate":"2024-03-04"},{"lineNumber":104,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":105,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":106,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:odd {","lastModifiedDate":"2024-03-04"},{"lineNumber":107,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #515658;","lastModifiedDate":"2024-03-04"},{"lineNumber":108,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":109,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":110,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:selected {","lastModifiedDate":"2024-03-04"},{"lineNumber":111,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #424d5f;","lastModifiedDate":"2024-03-04"},{"lineNumber":112,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":113,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":114,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:selected #cardPane {","lastModifiedDate":"2024-03-04"},{"lineNumber":115,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: #3e7b91;","lastModifiedDate":"2024-03-04"},{"lineNumber":116,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":117,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":118,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":119,"author":{"gitId":"Ella-e"},"content":".list-cell .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":120,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":121,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":122,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":123,"author":{"gitId":"Ella-e"},"content":".cell_big_label {","lastModifiedDate":"2024-03-04"},{"lineNumber":124,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":125,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 16px;","lastModifiedDate":"2024-03-04"},{"lineNumber":126,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-03-04"},{"lineNumber":127,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":128,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":129,"author":{"gitId":"Ella-e"},"content":".cell_small_label {","lastModifiedDate":"2024-03-04"},{"lineNumber":130,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI\";","lastModifiedDate":"2024-03-04"},{"lineNumber":131,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 13px;","lastModifiedDate":"2024-03-04"},{"lineNumber":132,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-03-04"},{"lineNumber":133,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":134,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":135,"author":{"gitId":"Ella-e"},"content":".stack-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":136,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":137,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":138,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":139,"author":{"gitId":"Ella-e"},"content":".pane-with-border {","lastModifiedDate":"2024-03-04"},{"lineNumber":140,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":141,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: derive(#1d1d1d, 10%);","lastModifiedDate":"2024-03-04"},{"lineNumber":142,"author":{"gitId":"Ella-e"},"content":" -fx-border-top-width: 1px;","lastModifiedDate":"2024-03-04"},{"lineNumber":143,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":144,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":145,"author":{"gitId":"Ella-e"},"content":".status-bar {","lastModifiedDate":"2024-03-04"},{"lineNumber":146,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":147,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":148,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":149,"author":{"gitId":"Ella-e"},"content":".result-display {","lastModifiedDate":"2024-03-04"},{"lineNumber":150,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":151,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":152,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":153,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":154,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":155,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":156,"author":{"gitId":"Ella-e"},"content":".result-display .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":157,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: black !important;","lastModifiedDate":"2024-03-04"},{"lineNumber":158,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":159,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":160,"author":{"gitId":"Ella-e"},"content":".status-bar .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":161,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":162,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":163,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 4px;","lastModifiedDate":"2024-03-04"},{"lineNumber":164,"author":{"gitId":"Ella-e"},"content":" -fx-pref-height: 30px;","lastModifiedDate":"2024-03-04"},{"lineNumber":165,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":166,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":167,"author":{"gitId":"Ella-e"},"content":".status-bar-with-border {","lastModifiedDate":"2024-03-04"},{"lineNumber":168,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":169,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-03-04"},{"lineNumber":171,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":172,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":173,"author":{"gitId":"Ella-e"},"content":".status-bar-with-border .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":174,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":175,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":176,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":177,"author":{"gitId":"Ella-e"},"content":".grid-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":178,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":179,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":180,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-03-04"},{"lineNumber":181,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":182,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":183,"author":{"gitId":"Ella-e"},"content":".grid-pane .stack-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":184,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":185,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":186,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":187,"author":{"gitId":"Ella-e"},"content":".context-menu {","lastModifiedDate":"2024-03-04"},{"lineNumber":188,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-03-04"},{"lineNumber":189,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":190,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":191,"author":{"gitId":"Ella-e"},"content":".context-menu .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":192,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":193,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":194,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":195,"author":{"gitId":"Ella-e"},"content":".menu-bar {","lastModifiedDate":"2024-03-04"},{"lineNumber":196,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":197,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":198,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":199,"author":{"gitId":"Ella-e"},"content":".menu-bar .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":200,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 14pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":201,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":202,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":203,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-03-04"},{"lineNumber":204,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":205,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":206,"author":{"gitId":"Ella-e"},"content":".menu .left-container {","lastModifiedDate":"2024-03-04"},{"lineNumber":207,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: black;","lastModifiedDate":"2024-03-04"},{"lineNumber":208,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":209,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":210,"author":{"gitId":"Ella-e"},"content":"/*","lastModifiedDate":"2024-03-04"},{"lineNumber":211,"author":{"gitId":"Ella-e"},"content":" * Metro style Push Button","lastModifiedDate":"2024-03-04"},{"lineNumber":212,"author":{"gitId":"Ella-e"},"content":" * Author: Pedro Duque Vieira","lastModifiedDate":"2024-03-04"},{"lineNumber":213,"author":{"gitId":"Ella-e"},"content":" * http://pixelduke.wordpress.com/2012/10/23/jmetro-windows-8-controls-on-java/","lastModifiedDate":"2024-03-04"},{"lineNumber":214,"author":{"gitId":"Ella-e"},"content":" */","lastModifiedDate":"2024-03-04"},{"lineNumber":215,"author":{"gitId":"Ella-e"},"content":".button {","lastModifiedDate":"2024-03-04"},{"lineNumber":216,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 5 22 5 22;","lastModifiedDate":"2024-03-04"},{"lineNumber":217,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: #e2e2e2;","lastModifiedDate":"2024-03-04"},{"lineNumber":218,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":219,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":220,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":221,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI\", Helvetica, Arial, sans-serif;","lastModifiedDate":"2024-03-04"},{"lineNumber":222,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":223,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #d8d8d8;","lastModifiedDate":"2024-03-04"},{"lineNumber":224,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 0 0 0 0, 0, 1, 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":225,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":226,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":227,"author":{"gitId":"Ella-e"},"content":".button:hover {","lastModifiedDate":"2024-03-04"},{"lineNumber":228,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #3a3a3a;","lastModifiedDate":"2024-03-04"},{"lineNumber":229,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":230,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":231,"author":{"gitId":"Ella-e"},"content":".button:pressed, .button:default:hover:pressed {","lastModifiedDate":"2024-03-04"},{"lineNumber":232,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":233,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":234,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":235,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":236,"author":{"gitId":"Ella-e"},"content":".button:focused {","lastModifiedDate":"2024-03-04"},{"lineNumber":237,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: white, white;","lastModifiedDate":"2024-03-04"},{"lineNumber":238,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1, 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":239,"author":{"gitId":"Ella-e"},"content":" -fx-border-style: solid, segments(1, 1);","lastModifiedDate":"2024-03-04"},{"lineNumber":240,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 0, 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":241,"author":{"gitId":"Ella-e"},"content":" -fx-border-insets: 1 1 1 1, 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":242,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":243,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":244,"author":{"gitId":"Ella-e"},"content":".button:disabled, .button:default:disabled {","lastModifiedDate":"2024-03-04"},{"lineNumber":245,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 0.4;","lastModifiedDate":"2024-03-04"},{"lineNumber":246,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":247,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":248,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":249,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":250,"author":{"gitId":"Ella-e"},"content":".button:default {","lastModifiedDate":"2024-03-04"},{"lineNumber":251,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-03-04"},{"lineNumber":252,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #ffffff;","lastModifiedDate":"2024-03-04"},{"lineNumber":253,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":254,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":255,"author":{"gitId":"Ella-e"},"content":".button:default:hover {","lastModifiedDate":"2024-03-04"},{"lineNumber":256,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(-fx-focus-color, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":257,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":258,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":259,"author":{"gitId":"Ella-e"},"content":".dialog-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":260,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":261,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":262,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":263,"author":{"gitId":"Ella-e"},"content":".dialog-pane \u003e *.button-bar \u003e *.container {","lastModifiedDate":"2024-03-04"},{"lineNumber":264,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":265,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":266,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":267,"author":{"gitId":"Ella-e"},"content":".dialog-pane \u003e *.label.content {","lastModifiedDate":"2024-03-04"},{"lineNumber":268,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 14px;","lastModifiedDate":"2024-03-04"},{"lineNumber":269,"author":{"gitId":"Ella-e"},"content":" -fx-font-weight: bold;","lastModifiedDate":"2024-03-04"},{"lineNumber":270,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":271,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":272,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":273,"author":{"gitId":"Ella-e"},"content":".dialog-pane:header *.header-panel {","lastModifiedDate":"2024-03-04"},{"lineNumber":274,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-03-04"},{"lineNumber":275,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":276,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":277,"author":{"gitId":"Ella-e"},"content":".dialog-pane:header *.header-panel *.label {","lastModifiedDate":"2024-03-04"},{"lineNumber":278,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 18px;","lastModifiedDate":"2024-03-04"},{"lineNumber":279,"author":{"gitId":"Ella-e"},"content":" -fx-font-style: italic;","lastModifiedDate":"2024-03-04"},{"lineNumber":280,"author":{"gitId":"Ella-e"},"content":" -fx-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":281,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":282,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":283,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":284,"author":{"gitId":"Ella-e"},"content":".scroll-bar {","lastModifiedDate":"2024-03-04"},{"lineNumber":285,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":286,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":287,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":288,"author":{"gitId":"Ella-e"},"content":".scroll-bar .thumb {","lastModifiedDate":"2024-03-04"},{"lineNumber":289,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"Ella-e"},"content":".scroll-bar .increment-button, .scroll-bar .decrement-button {","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"Ella-e"},"content":".scroll-bar .increment-arrow, .scroll-bar .decrement-arrow {","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"Ella-e"},"content":" -fx-shape: \" \";","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"Ella-e"},"content":".scroll-bar:vertical .increment-arrow, .scroll-bar:vertical .decrement-arrow {","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 1 8 1 8;","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"Ella-e"},"content":".scroll-bar:horizontal .increment-arrow, .scroll-bar:horizontal .decrement-arrow {","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 8 1 8 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"Ella-e"},"content":"#cardPane {","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"Ella-e"},"content":"#commandTypeLabel {","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11px;","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #F70D1A;","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"Ella-e"},"content":"#commandTextField {","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent #383838 transparent #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: #383838 #383838 #ffffff #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"Ella-e"},"content":" -fx-border-insets: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Ella-e"},"content":"#filterField, #personListPanel, #personWebpage {","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"Ella-e"},"content":" -fx-effect: innershadow(gaussian, black, 10, 0, 0, 0);","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"Ella-e"},"content":"#resultDisplay .content {","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent, #383838, transparent, #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"Ella-e"},"content":"#tags {","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Ella-e"},"content":" -fx-hgap: 7;","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Ella-e"},"content":" -fx-vgap: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Ella-e"},"content":"#tags .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #3e7b91;","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 1 3 1 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11;","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":352}},{"path":"bin/main/view/Extensions.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":".error {","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #d06651 !important; /* The error class should always override the default text-fill style */","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":".list-cell:empty {","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" /* Empty cells will not have alternating colours */","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" -fx-background: #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":".tag-selector {","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":".tooltip-text {","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":20}},{"path":"bin/main/view/HelpWindow.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"#copyButton, #helpMessage {","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"#copyButton {","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: dimgray;","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"#copyButton:hover {","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: gray;","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"#copyButton:armed {","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: darkgray;","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"#helpMessageContainer {","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":19}},{"path":"bin/main/view/HelpWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Button?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.stage.Stage?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"\u003cfx:root resizable\u003d\"false\" title\u003d\"Help\" type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" \u003cImage url\u003d\"@/images/help_icon.png\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" \u003cURL value\u003d\"@HelpWindow.css\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" \u003cHBox alignment\u003d\"CENTER\" fx:id\u003d\"helpMessageContainer\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" \u003cchildren\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"helpMessage\" text\u003d\"Label\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":" \u003cInsets right\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" \u003cButton fx:id\u003d\"copyButton\" mnemonicParsing\u003d\"false\" onAction\u003d\"#copyUrl\" text\u003d\"Copy URL\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":" \u003cInsets left\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" \u003c/Button\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":" \u003c/children\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":" \u003copaqueInsets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":" \u003c/opaqueInsets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"Ella-e"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":44}},{"path":"bin/main/view/MainWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Menu?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.MenuBar?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.MenuItem?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.SplitPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":"\u003cfx:root type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" title\u003d\"Address App\" minWidth\u003d\"450\" minHeight\u003d\"600\" onCloseRequest\u003d\"#handleExit\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" \u003cImage url\u003d\"@/images/address_book_32.png\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" \u003cURL value\u003d\"@DarkTheme.css\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" \u003cURL value\u003d\"@Extensions.css\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":" \u003cVBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":" \u003cMenuBar fx:id\u003d\"menuBar\" VBox.vgrow\u003d\"NEVER\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"File\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" \u003cMenuItem mnemonicParsing\u003d\"false\" onAction\u003d\"#handleExit\" text\u003d\"Exit\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"Help\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":" \u003cMenuItem fx:id\u003d\"helpMenuItem\" mnemonicParsing\u003d\"false\" onAction\u003d\"#handleHelp\" text\u003d\"Help\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":" \u003c/MenuBar\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"commandBoxPlaceholder\" styleClass\u003d\"pane-with-border\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"resultDisplayPlaceholder\" styleClass\u003d\"pane-with-border\"","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"Ella-e"},"content":" minHeight\u003d\"100\" prefHeight\u003d\"100\" maxHeight\u003d\"100\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"Ella-e"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"Ella-e"},"content":" \u003cVBox fx:id\u003d\"personList\" styleClass\u003d\"pane-with-border\" minWidth\u003d\"340\" prefWidth\u003d\"340\" VBox.vgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"10\" right\u003d\"10\" bottom\u003d\"10\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane fx:id\u003d\"personListPanelPlaceholder\" VBox.vgrow\u003d\"ALWAYS\"/\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"Ella-e"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane fx:id\u003d\"statusbarPlaceholder\" VBox.vgrow\u003d\"NEVER\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"Ella-e"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"Ella-e"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"Ella-e"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"Ella-e"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":60}},{"path":"bin/main/view/PersonListCard.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"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":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":" \u003cFlowPane fx:id\u003d\"tags\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":36}},{"path":"bin/main/view/PersonListPanel.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.ListView?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003cVBox xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" \u003cListView fx:id\u003d\"personListView\" VBox.vgrow\u003d\"ALWAYS\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c/VBox\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":8}},{"path":"bin/main/view/ResultDisplay.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.TextArea?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003cStackPane fx:id\u003d\"placeHolder\" styleClass\u003d\"pane-with-border\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" \u003cTextArea fx:id\u003d\"resultDisplay\" editable\u003d\"false\" styleClass\u003d\"result-display\"/\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":9}},{"path":"bin/main/view/StatusBarFooter.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003cGridPane styleClass\u003d\"status-bar\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"saveLocationStatus\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"\u003c/GridPane\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":12}},{"path":"bin/test/view/UiPartTest/invalidFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"Not a valid FXML file","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":1}},{"path":"bin/test/view/UiPartTest/validFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import seedu.address.ui.TestFxmlObject?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003cTestFxmlObject xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:id\u003d\"validFileRoot\"\u003eHello World!\u003c/TestFxmlObject\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":4}},{"path":"bin/test/view/UiPartTest/validFileWithFxRoot.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003cfx:root type\u003d\"seedu.address.ui.TestFxmlObject\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":" \u003ctext\u003eHello World!\u003c/text\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":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":"javierng2knus"},"content":"### Ng Wei Chong Javier","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"javierng2knus"},"content":"\u003cimg src\u003d\"images/javierng2knus.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"javierng2knus"},"content":"[[github](https://github.com/javierng2knus)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"javierng2knus"},"content":"[[portfolio](team/javier.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"javierng2knus"},"content":"* Role: Team lead","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"javierng2knus"},"content":"* Responsibilities: \u003cWill be reassigned on a later date\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"MaYuehan"},"content":"### Ma Yuehan","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"MaYuehan"},"content":"\u003cimg src\u003d\"images/mayuehan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"MaYuehan"},"content":"[[github](https://github.com/MaYuehan)]","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"MaYuehan"},"content":"[[portfolio](team/mayuehan.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"MaYuehan"},"content":"* Responsibilities: Command implementation, documentation, Ui","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":"### Mu Zhaoyu","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"\u003cimg src\u003d\"images/ella-e.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"[[github](http://github.com/Ella-e)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":"[[portfolio](team/ella-e.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"* Responsibilities: Command implementation, documentation","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":"### Lai Yiwen","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":"\u003cimg src\u003d\"images/seahogs.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":47,"author":{"gitId":"Ella-e"},"content":"[[portfolio](team/seahogs.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Ella-e"},"content":"* Responsibilities: Command implementation, documentation","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"javierng2knus":6,"MaYuehan":5,"Ella-e":9,"-":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":"Ella-e"},"content":"* has a need to manage a significant number of patient records and contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":266,"author":{"gitId":"Ella-e"},"content":"* need to manage a significant number of appointments","lastModifiedDate":"2024-03-04"},{"lineNumber":267,"author":{"gitId":"Ella-e"},"content":"* need to have a reminder of upcoming appointments","lastModifiedDate":"2024-03-04"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"Ella-e"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":274,"author":{"gitId":"Ella-e"},"content":"VitalConnect aims to provide a robust and user-friendly platform for medical professionals to streamline their workflow by effectively managing patient information and appointments. The key value propositions include:","lastModifiedDate":"2024-03-06"},{"lineNumber":275,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":276,"author":{"gitId":"Ella-e"},"content":"* Efficient Patient Management: Users can easily add, modify, and retrieve patient information, ensuring a comprehensive and organized patient database.","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":278,"author":{"gitId":"Ella-e"},"content":"* Seamless Appointment Handling: VitalConnect allows for the effortless creation, modification, and deletion of appointments, ensuring accurate scheduling and coordination.","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"Ella-e"},"content":"* CLI Efficiency: The application caters to users who prefer typing commands over graphical interfaces, enabling faster and more precise data entry.","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"Ella-e"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (good to but might not have) - `*`","lastModifiedDate":"2024-03-04"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"Ella-e"},"content":"| `* * *` | new user | have a comprehensive document that details every possible feature. | learn how to use a particular feature |","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | add new patient, either with or without further information about the patient | |","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | delete patient | free storage resources |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | be able to add the contact information of my patient into the database | I can get in touch with them when needed or under emergency situation |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | be able to delete the contact information for a particular patient when the information is outdated | I can keep in touch with my patient |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | list all patients and their contacts | |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"Ella-e"},"content":"| `* * *` | intermediate user | add appointment to free time slot | easily schedule an appointment and find free time slot for it |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"Ella-e"},"content":"| `* * *` | intermediate user | delete appointment to free time slot | remove reservation if the patient is unable to attend |","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"Ella-e"},"content":"| `* * *` | intermediate user | list appointments | I can see all the appointments. |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | add medication instructions for the patient | have a better understanding of the medication history of my patient |","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | list all information about specific patient | see the detail information of the patient |","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"Ella-e"},"content":"| `* *` | user | be able to modify/update the information of a particular patient | I can keep the most-updated information |","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"Ella-e"},"content":"| `* *` | user | be able to modify an appointment details of a patient | I can keep the most-updated appointment information |","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"Ella-e"},"content":"| `* *` | new user | option for undo most precent change | I can quickly fix my mistyped command |","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"Ella-e"},"content":"| `* *` | beginner | set the reminder for an appointment | remind me when Im busy with work |","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"Ella-e"},"content":"| `* *` | user | mark a reminder as done | better track the undo work |","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"Ella-e"},"content":"| `* *` | user | mark some of the patients as the special focus | better track the state of illness of patients who are in a very serious state |","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"Ella-e"},"content":"| `* *` | expert user | have short forms of existing commands | save time on typing the commands |","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"Ella-e"},"content":"| `* *` | new user | interactive guide with sample data | quickly understand app\u0027s capabilities |","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"Ella-e"},"content":"| `* *` | Doctor who is colaborating with other doctor | ability to leave comments or annotations on shared patient records | communicate specific insights or recommendations to my colleague |","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"Ella-e"},"content":"| `* *` | intermediate user | see the previous doage that the patient take in his medical record page | Adjust the dosage for the patient according to his/her state of illness |","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"Ella-e"},"content":"| `* *` | intermediate user | search about the patient\u0027s allergy history | Prescribing safe medication for patients |","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"Ella-e"},"content":"| `* *` | intermediate user | know about the previous illnesses of the patient | help to diagnose causes more accurately |","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"Ella-e"},"content":"| `* *` | intermediate user | be able to update the patient\u0027s condition upon the previous appointment | better track the sate of illness of the patient |","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"Ella-e"},"content":"| `*` | new user | suggestion on correction for mistyped commands | avoid typing wrong comands |","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"Ella-e"},"content":"| `*` | user | have a way to assign specific colors to specific tags | better differentiate the existing tags |","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"Ella-e"},"content":"| `*` | user | have a icon or button beside a feature that shows a tooltip when hovered | quickly find out information about the feature without needing other references |","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"Ella-e"},"content":"| `*` | user | have a method of giving feedback to the developers | share aspects of the product that I would like changes to |","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"Ella-e"},"content":"| `*` | new user | have the ability to switch to a more simplified and beginner friendly UI | more effectively learn the basics |","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"Ella-e"},"content":"| `*` | trainee doctor | be able to refer to similar previous cases | study treatment that helps with this kind of cases |","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"Ella-e"},"content":"| `*` | experienced user | an efficient way to export and backup patient data | ensure the safety and accessibility of important information |","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"Ella-e"},"content":"| `*` | intermediate user | export selected patient\u0027s information | give the patient their personal information after they change their doctors, and delete the patient\u0027s information from the database safely |","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"Ella-e"},"content":"| `*` | intermediate user | export selected medical instructions | The patient can follow my medical instructions closely |","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Ella-e"},"content":"| `*` | intermediate user | see the list of patients based on the next follow-up meeting/calling time | have a better plan for my time and know which patient needs my attention next |","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"Ella-e"},"content":"(For all use cases below, the **System** is the `VitalConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"Ella-e"},"content":"**Use case: UC1 - Add a patient**","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"Ella-e"},"content":"1. User requests to add a patient by keying the patient\u0027s name and NRIC in the command.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect adds the patient\u0027s name and NRIC.","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"Ella-e"},"content":"* 1a. The NRIC already exists in the system.","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays warning message and the existing patient\u0027s information.","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Ella-e"},"content":"* 1b. The NRIC or name entered is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"Ella-e"},"content":"**Use case: UC2 - Delete a patient**","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Ella-e"},"content":"1. User requests to delete a patient by keying the patient\u0027s name or NRIC in the command.","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect deletes the patient from database.","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"Ella-e"},"content":"* 1a. The patient doesn\u0027t exist in the system.","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"Ella-e"},"content":"**Use case: UC3 - Add an appointment**","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"Ella-e"},"content":"1. User requests to add an appointment for a patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect add the appointment to the database under this patient\u0027s NRIC.","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"Ella-e"},"content":"* 1a. Critical information (time and doctor) missing in the appointment.","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"Ella-e"},"content":"* 1b. The assigned patient doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"Ella-e"},"content":"* 1c. The appointment time crashes with existing time.","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"Ella-e"},"content":" * 1c1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"Ella-e"},"content":" * 1c1. VitalConnect displays the appointment with crashing time.","lastModifiedDate":"2024-03-04"},{"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":"Ella-e"},"content":"**Use case: UC4 - Delete an appointment**","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"Ella-e"},"content":"1. User requests to delete an appointment for a patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect removes the appointment from the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"Ella-e"},"content":"* 1a. The assigned patient or the appointment doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"Ella-e"},"content":"**Use case: UC5 - Modify an appointment**","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"Ella-e"},"content":"1. User requests to modify an appointment for a patient by keying the appointment\u0027s id.","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect displays the detail of the appointment to be modified.","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"Ella-e"},"content":"3. User specify which field to be modified and enters the new information.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"Ella-e"},"content":"4. VitalConnect saves the new appointment information.","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"Ella-e"},"content":"5. VitalConnect displays the updated detail of the appointment modified.","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"Ella-e"},"content":"* 1a. The appointment refered by the id doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"Ella-e"},"content":"* 1b. The id is not a valid number.","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"Ella-e"},"content":"* 3a. The field to be modified is unrecognized.","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"Ella-e"},"content":" * 3a1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"Ella-e"},"content":" * 3a2. VitalConnect request for valid field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"Ella-e"},"content":" * 3a3. User enters new field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"Ella-e"},"content":" Steps 3a1-3a3 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"Ella-e"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"Ella-e"},"content":"* 3b. The new information is in invalid form or contains invalid character.","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"Ella-e"},"content":" * 3b1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"Ella-e"},"content":" * 3b2. VitalConnect request for valid data entry.","lastModifiedDate":"2024-03-04"},{"lineNumber":402,"author":{"gitId":"Ella-e"},"content":" * 3b3. User enters new field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":403,"author":{"gitId":"Ella-e"},"content":" Steps 3b1-3b3 are repeated until the data entered are valid.","lastModifiedDate":"2024-03-04"},{"lineNumber":404,"author":{"gitId":"Ella-e"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"Ella-e"},"content":"* 3c. The appointment time crashes with existing time.","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"Ella-e"},"content":" * 3c1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"Ella-e"},"content":" * 3c2. VitalConnect displays the appointment with crashing time.","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"Ella-e"},"content":" * 3c3. VitalConnect request for valid data entry.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"Ella-e"},"content":" * 3c4. User enters new field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"Ella-e"},"content":" Steps 3c1-3c4 are repeated until the time doesn\u0027t crash.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"Ella-e"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"Ella-e"},"content":"**Use case: UC6 - Add contact information**","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"Ella-e"},"content":"1. User requests to add contact information for a patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect save the contact information to the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"Ella-e"},"content":"* 1a. The patient doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"Ella-e"},"content":"* 1b. The contact information is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"Ella-e"},"content":"**Use case: UC7 - Delete contact information**","lastModifiedDate":"2024-03-04"},{"lineNumber":427,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":428,"author":{"gitId":"Ella-e"},"content":"1. User requests to delete contact information for a patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":429,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect remove the contact information to the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":430,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"Ella-e"},"content":"* 1a. The patient or contact information doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":433,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"Ella-e"},"content":"**Use case: UC8 - Modify contact information**","lastModifiedDate":"2024-03-04"},{"lineNumber":437,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":438,"author":{"gitId":"Ella-e"},"content":"1. User requests to modify contact information for a patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":439,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect displays the updated contact information of the patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":440,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":441,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"Ella-e"},"content":"* 1a. The patient or contact information doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":443,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"Ella-e"},"content":"* 1b. The contact information is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":446,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":447,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"Ella-e"},"content":"# Technical Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":452,"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":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"Ella-e"},"content":"# Performance Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":455,"author":{"gitId":"Ella-e"},"content":"1. Should be able to hold up to 100 patients with 1000 appointments without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-04"},{"lineNumber":456,"author":{"gitId":"Ella-e"},"content":"2. The system should respond within 3 seconds.","lastModifiedDate":"2024-03-04"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":458,"author":{"gitId":"Ella-e"},"content":"# Quality Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":459,"author":{"gitId":"Ella-e"},"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-04"},{"lineNumber":460,"author":{"gitId":"Ella-e"},"content":"2. System should be robust for any form of data file crashes and invalid user input.","lastModifiedDate":"2024-03-04"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":462,"author":{"gitId":"Ella-e"},"content":"# Scope","lastModifiedDate":"2024-03-04"},{"lineNumber":463,"author":{"gitId":"Ella-e"},"content":"1. The product will \u003cstrong\u003eNOT\u003c/strong\u003e enforce any form of protection of the generated data file containing patients\u0027 information. The organization should be responsible for ensuring the safety of their patient\u0027s data.","lastModifiedDate":"2024-03-04"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":465,"author":{"gitId":"Ella-e"},"content":"# Process Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":466,"author":{"gitId":"Ella-e"},"content":"1. The project is expected to grow in breadth-first iterative process.","lastModifiedDate":"2024-03-04"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":471,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"SeaHogs"},"content":"* **CLI**: Acronym for Command Line Interface, a text-based interface where users interact with the application by typing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":473,"author":{"gitId":"SeaHogs"},"content":"* **VitalConnect**: The system being described, representing the medical management application.","lastModifiedDate":"2024-03-06"},{"lineNumber":474,"author":{"gitId":"SeaHogs"},"content":"* **User**: The person interacting with the VitalConnect system to perform various actions.","lastModifiedDate":"2024-03-06"},{"lineNumber":475,"author":{"gitId":"SeaHogs"},"content":"* **Use Case**: A specific scenario or situation in which a user interacts with the VitalConnect system to achieve a specific goal.","lastModifiedDate":"2024-03-06"},{"lineNumber":476,"author":{"gitId":"SeaHogs"},"content":"* **MSS (Main Success Scenario)**: The primary sequence of steps in a use case that represents the successful accomplishment of the user\u0027s goal.","lastModifiedDate":"2024-03-06"},{"lineNumber":477,"author":{"gitId":"SeaHogs"},"content":"* **Extensions**: Additional scenarios that may occur during the execution of a use case, usually describing alternative paths or error-handling situations.","lastModifiedDate":"2024-03-06"},{"lineNumber":478,"author":{"gitId":"SeaHogs"},"content":"* **NRIC**: National Registration Identity Card, a unique identification number used in some countries.","lastModifiedDate":"2024-03-06"},{"lineNumber":479,"author":{"gitId":"SeaHogs"},"content":"* **Database**: A structured set of data stored electronically, in this context, referring to the storage system for patient and appointment information.","lastModifiedDate":"2024-03-06"},{"lineNumber":480,"author":{"gitId":"SeaHogs"},"content":"* **Appointment**: A scheduled meeting or arrangement, often referring to a scheduled medical consultation in the context of VitalConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":481,"author":{"gitId":"SeaHogs"},"content":"* **Field**: In the context of modifying an appointment, a specific piece of information within the appointment details that the user can choose to modify (e.g., time, doctor).","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"SeaHogs"},"content":"* **ID (Identification Number)**: A unique identifier associated with a specific appointment, used to distinguish and reference individual appointments.","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"SeaHogs"},"content":"* **Contact Information**: Information related to how the system can reach or contact a patient, such as phone number or email address.","lastModifiedDate":"2024-03-06"},{"lineNumber":484,"author":{"gitId":"SeaHogs"},"content":"* **Warning Message**: An alert displayed by the VitalConnect system to notify the user of a potential issue or discrepancy.","lastModifiedDate":"2024-03-06"},{"lineNumber":485,"author":{"gitId":"SeaHogs"},"content":"* **Error Message**: A notification displayed by the VitalConnect system to inform the user about a critical issue or mistake.","lastModifiedDate":"2024-03-06"},{"lineNumber":486,"author":{"gitId":"SeaHogs"},"content":"* **Crashing Time**: A situation where the proposed time for an appointment conflicts with an existing appointment time in the system.","lastModifiedDate":"2024-03-06"},{"lineNumber":487,"author":{"gitId":"SeaHogs"},"content":"* **Invalid Data Entry**: Information entered by the user that does not meet the required format or criteria.","lastModifiedDate":"2024-03-06"},{"lineNumber":488,"author":{"gitId":"SeaHogs"},"content":"* **Valid Data Entry**: Information entered by the user that meets the required format or criteria.","lastModifiedDate":"2024-03-06"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"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":497,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"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":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"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":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"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":526,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"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":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"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":531,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Ella-e":167,"-":357,"SeaHogs":17}},{"path":"docs/team/ella-e.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"layout: page","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"title: Mu Zhaoyu\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"## Project: VitalConnect","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"This product is doctors or any healthcare workers that have to keep track of a lot ","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"of patient information and requires the information at a fast pace, ","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"thus preferring to have a simple UI such as a CLI instead of a complex GUI, ","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":"### **New Feature**: ","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"1. __Create an appointment__","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to create an appointment for a patient with the time and date.","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"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-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"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-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":"2. __Delete an appointment__","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to delete an appointment by specifying the appointment index and the patient\u0027s name.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":"3. __List appointments__","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to list out all the upcoming appointments that ordering by time.","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":"### **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":"User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"* Added documentation for the features `Create Appointments`, `Delete Appointments` and `List Appointments` [\\#72]()","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":42}},{"path":"docs/team/mayuehan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MaYuehan"},"content":"---","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"MaYuehan"},"content":"layout: page","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"MaYuehan"},"content":"title: Ma Yuehan\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"MaYuehan"},"content":"---","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"MaYuehan"},"content":"## Project: VitalConnect","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"MaYuehan"},"content":"This product is doctors or any healthcare workers that have to keep track of a lot ","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"MaYuehan"},"content":"of patient information and requires the information at a fast pace, ","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"MaYuehan"},"content":"thus preferring to have a simple UI such as a CLI instead of a complex GUI, ","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"MaYuehan"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"MaYuehan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"MaYuehan"},"content":"### **New Feature**: ","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"MaYuehan"},"content":"1. __Create an appointment__","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"MaYuehan"},"content":"* What it does: allows the user to create an appointment for a patient with the time and date.","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"MaYuehan"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"MaYuehan"},"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-25"},{"lineNumber":22,"author":{"gitId":"MaYuehan"},"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-25"},{"lineNumber":23,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"MaYuehan"},"content":"2. __Delete an appointment__","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"MaYuehan"},"content":"* What it does: allows the user to delete an appointment by specifying the appointment index and the patient\u0027s name.","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"MaYuehan"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"MaYuehan"},"content":"* Credits:","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"MaYuehan"},"content":"3. __List appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"MaYuehan"},"content":"* What it does: allows the user to list out all the upcoming appointments that ordering by time.","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"MaYuehan"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"MaYuehan"},"content":"* Credits:","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"MaYuehan"},"content":"### **Documentation**:","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"MaYuehan"},"content":"User Guide:","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"MaYuehan"},"content":"* Added documentation for the features `Create Appointments`, `Delete Appointments` and `List Appointments` [\\#72]()","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"MaYuehan":42}},{"path":"docs/team/seahogs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"title: Mu Zhaoyu\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"## Project: VitalConnect","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"This product is doctors or any healthcare workers that have to keep track of a lot","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"of patient information and requires the information at a fast pace,","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"thus preferring to have a simple UI such as a CLI instead of a complex GUI,","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":"### **New Feature**:","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"1. __Create an appointment__","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to create an appointment for a patient with the time and date.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"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":22,"author":{"gitId":"Ella-e"},"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":23,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":"2. __Delete an appointment__","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to delete an appointment by specifying the appointment index and the patient\u0027s name.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":"3. __List appointments__","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to list out all the upcoming appointments that ordering by time.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":"### **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":"User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"* Added documentation for the features `Create Appointments`, `Delete Appointments` and `List Appointments` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Ella-e":42}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MaYuehan"},"content":"# VitalConnect","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"MaYuehan"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W08-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W08-2/tp/actions)","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"MaYuehan"},"content":"This product is for clinic assistants that have to keep track of a lot of patient information and requires ","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"MaYuehan"},"content":"the information at a fast pace, thus preferring to have a simple UI such as a CLI instead of a complex GUI, ","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"MaYuehan"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"MaYuehan"},"content":"__Value proposition:__","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"MaYuehan"},"content":"Clinic assistants are required to take note of a multitude of information regarding the patient, ","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"MaYuehan"},"content":"such as their contact number, any existing medical condition, the specific treatment that they are currently undergoing and much more. ","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"MaYuehan"},"content":"With this product, such information will be readily available while also allowing for quality of life features such as scheduling ","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"MaYuehan"},"content":"appointments and managing medication.","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"MaYuehan"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"MaYuehan"},"content":"## Features (V1.2)","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"MaYuehan"},"content":"__Saving the data__","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"MaYuehan"},"content":"* All data is saved in the hard disk automatically after any command that changes the data.","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"MaYuehan"},"content":"__Clear all existing entries__","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"MaYuehan"},"content":"* Clear all the existing entries within the local database.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"MaYuehan"},"content":"__Exit the program__","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"MaYuehan"},"content":"* Exits the program. Any data that is not saved cannot be restored upon exiting.","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"MaYuehan"},"content":"__Viewing help__","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"MaYuehan"},"content":"* Shows a message explaining the instructions to access the user guide.","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"MaYuehan"},"content":"### Manage Appointments","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"MaYuehan"},"content":"__Create Appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"MaYuehan"},"content":"* Create an appointment of a patient, information such as time and name of patient are required when adding.","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"MaYuehan"},"content":"__Delete Appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"MaYuehan"},"content":"* Delete an appointment of a patient.","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"MaYuehan"},"content":"__List Appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"MaYuehan"},"content":"* List all the appointments that have been created, provide information such as the patient’s name and time of the appointments.","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"MaYuehan"},"content":"### Manage Contact Information","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"MaYuehan"},"content":"__Add patient contact information__","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"MaYuehan"},"content":"* Add contact information, including phone number and email address. If a specific field already exists, the command would fail.","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"MaYuehan"},"content":"__Delete patient contact information__","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"MaYuehan"},"content":"* Delete specific or all contact information, including phone number and email address.","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"MaYuehan"},"content":"__List patient contact information__","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"MaYuehan"},"content":"* List all patient’s contact information.","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"MaYuehan"},"content":"### Manage Patients","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"MaYuehan"},"content":"__Add patient__","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"MaYuehan"},"content":"* Add a new patient to the database so further information about their appointment or contact information can be added.","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"MaYuehan"},"content":"__Delete patient__","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"MaYuehan"},"content":"* Delete specific or all patients, including their contact and appointment.","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"MaYuehan":79,"-":3}},{"path":"bin/main/view/CommandBox.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.TextField?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003cStackPane styleClass\u003d\"stack-pane\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" \u003cTextField fx:id\u003d\"commandTextField\" onAction\u003d\"#handleCommandEntered\" promptText\u003d\"Enter command here...\"/\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":9}},{"path":"bin/main/view/DarkTheme.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":".background {","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":" background-color: #383838; /* Used in the default.html file */","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":".label {","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #555555;","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":".label-bright {","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":".label-header {","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 32pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":".text-field {","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 12pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":".tab-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":".tab-pane .tab-header-area {","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":" -fx-min-height: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":" -fx-max-height: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":".table-view {","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"Ella-e"},"content":" -fx-base: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":" -fx-control-inner-background: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"Ella-e"},"content":" -fx-table-cell-border-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"Ella-e"},"content":" -fx-table-header-border-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 5;","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"Ella-e"},"content":".table-view .column-header-background {","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"Ella-e"},"content":".table-view .column-header, .table-view .filler {","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"Ella-e"},"content":" -fx-size: 35;","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 0 0 1 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"Ella-e"},"content":" -fx-border-color:","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"Ella-e"},"content":" transparent","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"Ella-e"},"content":" transparent","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"Ella-e"},"content":" derive(-fx-base, 80%)","lastModifiedDate":"2024-03-04"},{"lineNumber":63,"author":{"gitId":"Ella-e"},"content":" transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"Ella-e"},"content":" -fx-border-insets: 0 10 1 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":66,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":67,"author":{"gitId":"Ella-e"},"content":".table-view .column-header .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":68,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 20pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":69,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":70,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":71,"author":{"gitId":"Ella-e"},"content":" -fx-alignment: center-left;","lastModifiedDate":"2024-03-04"},{"lineNumber":72,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":73,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":74,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":75,"author":{"gitId":"Ella-e"},"content":".table-view:focused .table-row-cell:filled:focused:selected {","lastModifiedDate":"2024-03-04"},{"lineNumber":76,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-03-04"},{"lineNumber":77,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":78,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":79,"author":{"gitId":"Ella-e"},"content":".split-pane:horizontal .split-pane-divider {","lastModifiedDate":"2024-03-04"},{"lineNumber":80,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":81,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: transparent transparent transparent #4d4d4d;","lastModifiedDate":"2024-03-04"},{"lineNumber":82,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":83,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":84,"author":{"gitId":"Ella-e"},"content":".split-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":85,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":86,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":87,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":88,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":89,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":90,"author":{"gitId":"Ella-e"},"content":".list-view {","lastModifiedDate":"2024-03-04"},{"lineNumber":91,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":92,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":93,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":94,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":95,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":96,"author":{"gitId":"Ella-e"},"content":".list-cell {","lastModifiedDate":"2024-03-04"},{"lineNumber":97,"author":{"gitId":"Ella-e"},"content":" -fx-label-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":98,"author":{"gitId":"Ella-e"},"content":" -fx-graphic-text-gap : 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":99,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":100,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":101,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":102,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:even {","lastModifiedDate":"2024-03-04"},{"lineNumber":103,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #3c3e3f;","lastModifiedDate":"2024-03-04"},{"lineNumber":104,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":105,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":106,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:odd {","lastModifiedDate":"2024-03-04"},{"lineNumber":107,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #515658;","lastModifiedDate":"2024-03-04"},{"lineNumber":108,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":109,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":110,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:selected {","lastModifiedDate":"2024-03-04"},{"lineNumber":111,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #424d5f;","lastModifiedDate":"2024-03-04"},{"lineNumber":112,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":113,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":114,"author":{"gitId":"Ella-e"},"content":".list-cell:filled:selected #cardPane {","lastModifiedDate":"2024-03-04"},{"lineNumber":115,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: #3e7b91;","lastModifiedDate":"2024-03-04"},{"lineNumber":116,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":117,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":118,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":119,"author":{"gitId":"Ella-e"},"content":".list-cell .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":120,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":121,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":122,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":123,"author":{"gitId":"Ella-e"},"content":".cell_big_label {","lastModifiedDate":"2024-03-04"},{"lineNumber":124,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Semibold\";","lastModifiedDate":"2024-03-04"},{"lineNumber":125,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 16px;","lastModifiedDate":"2024-03-04"},{"lineNumber":126,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-03-04"},{"lineNumber":127,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":128,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":129,"author":{"gitId":"Ella-e"},"content":".cell_small_label {","lastModifiedDate":"2024-03-04"},{"lineNumber":130,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI\";","lastModifiedDate":"2024-03-04"},{"lineNumber":131,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 13px;","lastModifiedDate":"2024-03-04"},{"lineNumber":132,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #010504;","lastModifiedDate":"2024-03-04"},{"lineNumber":133,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":134,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":135,"author":{"gitId":"Ella-e"},"content":".stack-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":136,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":137,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":138,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":139,"author":{"gitId":"Ella-e"},"content":".pane-with-border {","lastModifiedDate":"2024-03-04"},{"lineNumber":140,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":141,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: derive(#1d1d1d, 10%);","lastModifiedDate":"2024-03-04"},{"lineNumber":142,"author":{"gitId":"Ella-e"},"content":" -fx-border-top-width: 1px;","lastModifiedDate":"2024-03-04"},{"lineNumber":143,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":144,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":145,"author":{"gitId":"Ella-e"},"content":".status-bar {","lastModifiedDate":"2024-03-04"},{"lineNumber":146,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":147,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":148,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":149,"author":{"gitId":"Ella-e"},"content":".result-display {","lastModifiedDate":"2024-03-04"},{"lineNumber":150,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":151,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":152,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":153,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":154,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":155,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":156,"author":{"gitId":"Ella-e"},"content":".result-display .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":157,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: black !important;","lastModifiedDate":"2024-03-04"},{"lineNumber":158,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":159,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":160,"author":{"gitId":"Ella-e"},"content":".status-bar .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":161,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":162,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":163,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 4px;","lastModifiedDate":"2024-03-04"},{"lineNumber":164,"author":{"gitId":"Ella-e"},"content":" -fx-pref-height: 30px;","lastModifiedDate":"2024-03-04"},{"lineNumber":165,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":166,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":167,"author":{"gitId":"Ella-e"},"content":".status-bar-with-border {","lastModifiedDate":"2024-03-04"},{"lineNumber":168,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":169,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-03-04"},{"lineNumber":170,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-03-04"},{"lineNumber":171,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":172,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":173,"author":{"gitId":"Ella-e"},"content":".status-bar-with-border .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":174,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":175,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":176,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":177,"author":{"gitId":"Ella-e"},"content":".grid-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":178,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":179,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":180,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1px;","lastModifiedDate":"2024-03-04"},{"lineNumber":181,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":182,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":183,"author":{"gitId":"Ella-e"},"content":".grid-pane .stack-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":184,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":185,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":186,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":187,"author":{"gitId":"Ella-e"},"content":".context-menu {","lastModifiedDate":"2024-03-04"},{"lineNumber":188,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-03-04"},{"lineNumber":189,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":190,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":191,"author":{"gitId":"Ella-e"},"content":".context-menu .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":192,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":193,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":194,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":195,"author":{"gitId":"Ella-e"},"content":".menu-bar {","lastModifiedDate":"2024-03-04"},{"lineNumber":196,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":197,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":198,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":199,"author":{"gitId":"Ella-e"},"content":".menu-bar .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":200,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 14pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":201,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":202,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":203,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 0.9;","lastModifiedDate":"2024-03-04"},{"lineNumber":204,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":205,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":206,"author":{"gitId":"Ella-e"},"content":".menu .left-container {","lastModifiedDate":"2024-03-04"},{"lineNumber":207,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: black;","lastModifiedDate":"2024-03-04"},{"lineNumber":208,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":209,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":210,"author":{"gitId":"Ella-e"},"content":"/*","lastModifiedDate":"2024-03-04"},{"lineNumber":211,"author":{"gitId":"Ella-e"},"content":" * Metro style Push Button","lastModifiedDate":"2024-03-04"},{"lineNumber":212,"author":{"gitId":"Ella-e"},"content":" * Author: Pedro Duque Vieira","lastModifiedDate":"2024-03-04"},{"lineNumber":213,"author":{"gitId":"Ella-e"},"content":" * http://pixelduke.wordpress.com/2012/10/23/jmetro-windows-8-controls-on-java/","lastModifiedDate":"2024-03-04"},{"lineNumber":214,"author":{"gitId":"Ella-e"},"content":" */","lastModifiedDate":"2024-03-04"},{"lineNumber":215,"author":{"gitId":"Ella-e"},"content":".button {","lastModifiedDate":"2024-03-04"},{"lineNumber":216,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 5 22 5 22;","lastModifiedDate":"2024-03-04"},{"lineNumber":217,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: #e2e2e2;","lastModifiedDate":"2024-03-04"},{"lineNumber":218,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":219,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":220,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":221,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI\", Helvetica, Arial, sans-serif;","lastModifiedDate":"2024-03-04"},{"lineNumber":222,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":223,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #d8d8d8;","lastModifiedDate":"2024-03-04"},{"lineNumber":224,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 0 0 0 0, 0, 1, 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":225,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":226,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":227,"author":{"gitId":"Ella-e"},"content":".button:hover {","lastModifiedDate":"2024-03-04"},{"lineNumber":228,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #3a3a3a;","lastModifiedDate":"2024-03-04"},{"lineNumber":229,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":230,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":231,"author":{"gitId":"Ella-e"},"content":".button:pressed, .button:default:hover:pressed {","lastModifiedDate":"2024-03-04"},{"lineNumber":232,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":233,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":234,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":235,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":236,"author":{"gitId":"Ella-e"},"content":".button:focused {","lastModifiedDate":"2024-03-04"},{"lineNumber":237,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: white, white;","lastModifiedDate":"2024-03-04"},{"lineNumber":238,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1, 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":239,"author":{"gitId":"Ella-e"},"content":" -fx-border-style: solid, segments(1, 1);","lastModifiedDate":"2024-03-04"},{"lineNumber":240,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 0, 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":241,"author":{"gitId":"Ella-e"},"content":" -fx-border-insets: 1 1 1 1, 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":242,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":243,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":244,"author":{"gitId":"Ella-e"},"content":".button:disabled, .button:default:disabled {","lastModifiedDate":"2024-03-04"},{"lineNumber":245,"author":{"gitId":"Ella-e"},"content":" -fx-opacity: 0.4;","lastModifiedDate":"2024-03-04"},{"lineNumber":246,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":247,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":248,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":249,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":250,"author":{"gitId":"Ella-e"},"content":".button:default {","lastModifiedDate":"2024-03-04"},{"lineNumber":251,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: -fx-focus-color;","lastModifiedDate":"2024-03-04"},{"lineNumber":252,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #ffffff;","lastModifiedDate":"2024-03-04"},{"lineNumber":253,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":254,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":255,"author":{"gitId":"Ella-e"},"content":".button:default:hover {","lastModifiedDate":"2024-03-04"},{"lineNumber":256,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(-fx-focus-color, 30%);","lastModifiedDate":"2024-03-04"},{"lineNumber":257,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":258,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":259,"author":{"gitId":"Ella-e"},"content":".dialog-pane {","lastModifiedDate":"2024-03-04"},{"lineNumber":260,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":261,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":262,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":263,"author":{"gitId":"Ella-e"},"content":".dialog-pane \u003e *.button-bar \u003e *.container {","lastModifiedDate":"2024-03-04"},{"lineNumber":264,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #1d1d1d;","lastModifiedDate":"2024-03-04"},{"lineNumber":265,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":266,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":267,"author":{"gitId":"Ella-e"},"content":".dialog-pane \u003e *.label.content {","lastModifiedDate":"2024-03-04"},{"lineNumber":268,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 14px;","lastModifiedDate":"2024-03-04"},{"lineNumber":269,"author":{"gitId":"Ella-e"},"content":" -fx-font-weight: bold;","lastModifiedDate":"2024-03-04"},{"lineNumber":270,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":271,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":272,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":273,"author":{"gitId":"Ella-e"},"content":".dialog-pane:header *.header-panel {","lastModifiedDate":"2024-03-04"},{"lineNumber":274,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 25%);","lastModifiedDate":"2024-03-04"},{"lineNumber":275,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":276,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":277,"author":{"gitId":"Ella-e"},"content":".dialog-pane:header *.header-panel *.label {","lastModifiedDate":"2024-03-04"},{"lineNumber":278,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 18px;","lastModifiedDate":"2024-03-04"},{"lineNumber":279,"author":{"gitId":"Ella-e"},"content":" -fx-font-style: italic;","lastModifiedDate":"2024-03-04"},{"lineNumber":280,"author":{"gitId":"Ella-e"},"content":" -fx-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":281,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":282,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":283,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":284,"author":{"gitId":"Ella-e"},"content":".scroll-bar {","lastModifiedDate":"2024-03-04"},{"lineNumber":285,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":286,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":287,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":288,"author":{"gitId":"Ella-e"},"content":".scroll-bar .thumb {","lastModifiedDate":"2024-03-04"},{"lineNumber":289,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 50%);","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"Ella-e"},"content":".scroll-bar .increment-button, .scroll-bar .decrement-button {","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 0 0 0 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"Ella-e"},"content":".scroll-bar .increment-arrow, .scroll-bar .decrement-arrow {","lastModifiedDate":"2024-03-04"},{"lineNumber":299,"author":{"gitId":"Ella-e"},"content":" -fx-shape: \" \";","lastModifiedDate":"2024-03-04"},{"lineNumber":300,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":302,"author":{"gitId":"Ella-e"},"content":".scroll-bar:vertical .increment-arrow, .scroll-bar:vertical .decrement-arrow {","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 1 8 1 8;","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"Ella-e"},"content":".scroll-bar:horizontal .increment-arrow, .scroll-bar:horizontal .decrement-arrow {","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 8 1 8 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"Ella-e"},"content":"#cardPane {","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent;","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"Ella-e"},"content":"#commandTypeLabel {","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11px;","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #F70D1A;","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"Ella-e"},"content":"#commandTextField {","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent #383838 transparent #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Ella-e"},"content":" -fx-background-insets: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: #383838 #383838 #ffffff #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"Ella-e"},"content":" -fx-border-insets: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"Ella-e"},"content":" -fx-font-family: \"Segoe UI Light\";","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 13pt;","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Ella-e"},"content":"#filterField, #personListPanel, #personWebpage {","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"Ella-e"},"content":" -fx-effect: innershadow(gaussian, black, 10, 0, 0, 0);","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"Ella-e"},"content":"#resultDisplay .content {","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: transparent, #383838, transparent, #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 0;","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"Ella-e"},"content":"#tags {","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Ella-e"},"content":" -fx-hgap: 7;","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Ella-e"},"content":" -fx-vgap: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Ella-e"},"content":"#tags .label {","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: #3e7b91;","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"Ella-e"},"content":" -fx-padding: 1 3 1 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 2;","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"Ella-e"},"content":" -fx-font-size: 11;","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":352}},{"path":"bin/main/view/Extensions.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":".error {","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: #d06651 !important; /* The error class should always override the default text-fill style */","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":".list-cell:empty {","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" /* Empty cells will not have alternating colours */","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" -fx-background: #383838;","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":".tag-selector {","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":" -fx-border-width: 1;","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":" -fx-border-color: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" -fx-border-radius: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" -fx-background-radius: 3;","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":".tooltip-text {","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":20}},{"path":"bin/main/view/HelpWindow.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"#copyButton, #helpMessage {","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":" -fx-text-fill: white;","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"#copyButton {","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: dimgray;","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"#copyButton:hover {","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: gray;","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"#copyButton:armed {","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: darkgray;","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"#helpMessageContainer {","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" -fx-background-color: derive(#1d1d1d, 20%);","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"}","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":19}},{"path":"bin/main/view/HelpWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Button?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.stage.Stage?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"\u003cfx:root resizable\u003d\"false\" title\u003d\"Help\" type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" \u003cImage url\u003d\"@/images/help_icon.png\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" \u003cURL value\u003d\"@HelpWindow.css\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" \u003cHBox alignment\u003d\"CENTER\" fx:id\u003d\"helpMessageContainer\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" \u003cchildren\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"helpMessage\" text\u003d\"Label\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":" \u003cInsets right\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" \u003cButton fx:id\u003d\"copyButton\" mnemonicParsing\u003d\"false\" onAction\u003d\"#copyUrl\" text\u003d\"Copy URL\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":" \u003cHBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":" \u003cInsets left\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox.margin\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" \u003c/Button\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":" \u003c/children\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":" \u003copaqueInsets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":" \u003c/opaqueInsets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":" \u003cInsets bottom\u003d\"10.0\" left\u003d\"5.0\" right\u003d\"10.0\" top\u003d\"5.0\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"Ella-e"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":44}},{"path":"bin/main/view/MainWindow.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import java.net.URL?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.Scene?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Menu?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.MenuBar?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.MenuItem?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.SplitPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.image.Image?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":"\u003cfx:root type\u003d\"javafx.stage.Stage\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" title\u003d\"Address App\" minWidth\u003d\"450\" minHeight\u003d\"600\" onCloseRequest\u003d\"#handleExit\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" \u003cicons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" \u003cImage url\u003d\"@/images/address_book_32.png\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" \u003c/icons\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" \u003cscene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":" \u003cScene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":" \u003cstylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" \u003cURL value\u003d\"@DarkTheme.css\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" \u003cURL value\u003d\"@Extensions.css\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" \u003c/stylesheets\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":" \u003cVBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":" \u003cMenuBar fx:id\u003d\"menuBar\" VBox.vgrow\u003d\"NEVER\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"File\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" \u003cMenuItem mnemonicParsing\u003d\"false\" onAction\u003d\"#handleExit\" text\u003d\"Exit\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":" \u003cMenu mnemonicParsing\u003d\"false\" text\u003d\"Help\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":" \u003cMenuItem fx:id\u003d\"helpMenuItem\" mnemonicParsing\u003d\"false\" onAction\u003d\"#handleHelp\" text\u003d\"Help\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" \u003c/Menu\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":" \u003c/MenuBar\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"commandBoxPlaceholder\" styleClass\u003d\"pane-with-border\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane VBox.vgrow\u003d\"NEVER\" fx:id\u003d\"resultDisplayPlaceholder\" styleClass\u003d\"pane-with-border\"","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"Ella-e"},"content":" minHeight\u003d\"100\" prefHeight\u003d\"100\" maxHeight\u003d\"100\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"10\" bottom\u003d\"5\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"Ella-e"},"content":" \u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"Ella-e"},"content":" \u003cVBox fx:id\u003d\"personList\" styleClass\u003d\"pane-with-border\" minWidth\u003d\"340\" prefWidth\u003d\"340\" VBox.vgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"10\" right\u003d\"10\" bottom\u003d\"10\" left\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane fx:id\u003d\"personListPanelPlaceholder\" VBox.vgrow\u003d\"ALWAYS\"/\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"Ella-e"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"Ella-e"},"content":" \u003cStackPane fx:id\u003d\"statusbarPlaceholder\" VBox.vgrow\u003d\"NEVER\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"Ella-e"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"Ella-e"},"content":" \u003c/Scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"Ella-e"},"content":" \u003c/scene\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"Ella-e"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":60}},{"path":"bin/main/view/PersonListCard.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.geometry.Insets?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.FlowPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.HBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.Region?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"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":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":" \u003cGridPane HBox.hgrow\u003d\"ALWAYS\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" prefWidth\u003d\"150\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":" \u003cVBox alignment\u003d\"CENTER_LEFT\" minHeight\u003d\"105\" GridPane.columnIndex\u003d\"0\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":" \u003cpadding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":" \u003cInsets top\u003d\"5\" right\u003d\"5\" bottom\u003d\"5\" left\u003d\"15\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":" \u003c/padding\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"content":" \u003cHBox spacing\u003d\"5\" alignment\u003d\"CENTER_LEFT\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"id\" styleClass\u003d\"cell_big_label\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":" \u003cminWidth\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":" \u003c!-- Ensures that the label text is never truncated --\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":" \u003cRegion fx:constant\u003d\"USE_PREF_SIZE\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":" \u003c/minWidth\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":" \u003c/Label\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"name\" text\u003d\"\\$first\" styleClass\u003d\"cell_big_label\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":" \u003c/HBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":" \u003cFlowPane fx:id\u003d\"tags\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":" \u003c/VBox\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":" \u003c/GridPane\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"\u003c/HBox\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":36}},{"path":"bin/main/view/PersonListPanel.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.ListView?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.VBox?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003cVBox xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" \u003cListView fx:id\u003d\"personListView\" VBox.vgrow\u003d\"ALWAYS\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"\u003c/VBox\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":8}},{"path":"bin/main/view/ResultDisplay.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.TextArea?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.StackPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003cStackPane fx:id\u003d\"placeHolder\" styleClass\u003d\"pane-with-border\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" \u003cTextArea fx:id\u003d\"resultDisplay\" editable\u003d\"false\" styleClass\u003d\"result-display\"/\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"\u003c/StackPane\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":9}},{"path":"bin/main/view/StatusBarFooter.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.control.Label?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.ColumnConstraints?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"\u003c?import javafx.scene.layout.GridPane?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"\u003cGridPane styleClass\u003d\"status-bar\" xmlns\u003d\"http://javafx.com/javafx/17\" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":" \u003ccolumnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":" \u003cColumnConstraints hgrow\u003d\"SOMETIMES\" minWidth\u003d\"10\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":" \u003c/columnConstraints\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":" \u003cLabel fx:id\u003d\"saveLocationStatus\" /\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"\u003c/GridPane\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":12}},{"path":"bin/test/view/UiPartTest/invalidFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"Not a valid FXML file","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":1}},{"path":"bin/test/view/UiPartTest/validFile.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003c?import seedu.address.ui.TestFxmlObject?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"\u003cTestFxmlObject xmlns:fx\u003d\"http://javafx.com/fxml/1\" fx:id\u003d\"validFileRoot\"\u003eHello World!\u003c/TestFxmlObject\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":4}},{"path":"bin/test/view/UiPartTest/validFileWithFxRoot.fxml","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"\u003cfx:root type\u003d\"seedu.address.ui.TestFxmlObject\" xmlns\u003d\"http://javafx.com/javafx/17\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":" xmlns:fx\u003d\"http://javafx.com/fxml/1\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":" \u003ctext\u003eHello World!\u003c/text\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"\u003c/fx:root\u003e","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":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":"javierng2knus"},"content":"### Ng Wei Chong Javier","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"javierng2knus"},"content":"\u003cimg src\u003d\"images/javierng2knus.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"javierng2knus"},"content":"[[github](https://github.com/javierng2knus)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"javierng2knus"},"content":"[[portfolio](team/javier.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"javierng2knus"},"content":"* Role: Team lead","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"javierng2knus"},"content":"* Responsibilities: \u003cWill be reassigned on a later date\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"MaYuehan"},"content":"### Ma Yuehan","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"MaYuehan"},"content":"\u003cimg src\u003d\"images/mayuehan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"MaYuehan"},"content":"[[github](https://github.com/MaYuehan)]","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"MaYuehan"},"content":"[[portfolio](team/mayuehan.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"MaYuehan"},"content":"* Responsibilities: Command implementation, documentation, Ui","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":"### Mu Zhaoyu","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"\u003cimg src\u003d\"images/ella-e.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"[[github](http://github.com/Ella-e)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":"[[portfolio](team/ella-e.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"* Responsibilities: Command implementation, documentation","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":"### Lai Yiwen","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"Ella-e"},"content":"\u003cimg src\u003d\"images/seahogs.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":47,"author":{"gitId":"Ella-e"},"content":"[[portfolio](team/seahogs.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"Ella-e"},"content":"* Responsibilities: Command implementation, documentation","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"javierng2knus":6,"MaYuehan":5,"Ella-e":9,"-":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":"javierng2knus"},"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":14,"author":{"gitId":"javierng2knus"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"},{"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":"-"},"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":29,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"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":42,"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":43,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"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":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"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":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"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":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"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":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"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":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"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":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"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":85,"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":86,"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":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"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":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"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":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"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":101,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"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":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"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":"-"},"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":117,"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":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":120,"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":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"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":128,"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":129,"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":130,"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":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"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":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"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":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"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":147,"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":148,"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":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","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":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"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":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"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":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"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":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"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":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"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":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"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":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"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":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"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":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"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":195,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"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":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":211,"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":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"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":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"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":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"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":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","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":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":257,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"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":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"Ella-e"},"content":"* has a need to manage a significant number of patient records and contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":268,"author":{"gitId":"Ella-e"},"content":"* need to manage a significant number of appointments","lastModifiedDate":"2024-03-04"},{"lineNumber":269,"author":{"gitId":"Ella-e"},"content":"* need to have a reminder of upcoming appointments","lastModifiedDate":"2024-03-04"},{"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":"Ella-e"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-06"},{"lineNumber":276,"author":{"gitId":"Ella-e"},"content":"VitalConnect aims to provide a robust and user-friendly platform for medical professionals to streamline their workflow by effectively managing patient information and appointments. The key value propositions include:","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":278,"author":{"gitId":"Ella-e"},"content":"* Efficient Patient Management: Users can easily add, modify, and retrieve patient information, ensuring a comprehensive and organized patient database.","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"Ella-e"},"content":"* Seamless Appointment Handling: VitalConnect allows for the effortless creation, modification, and deletion of appointments, ensuring accurate scheduling and coordination.","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"Ella-e"},"content":"* CLI Efficiency: The application caters to users who prefer typing commands over graphical interfaces, enabling faster and more precise data entry.","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"Ella-e"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (good to but might not have) - `*`","lastModifiedDate":"2024-03-04"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"Ella-e"},"content":"| `* * *` | new user | have a comprehensive document that details every possible feature. | learn how to use a particular feature |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | user | add new patient, either with or without further basic information about the patient | |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | user | add the basic information of my patient into the database | so that I can better identify who the patient is |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"Ella-e"},"content":"| `* * *` | user | delete patient | free storage resources |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | user | list out all of the information about a particular patient | see the detailed information of the patient |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | user | add the contact information of my patient into the database | get in touch with them when needed or under emergency situation |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | user | delete the contact information for a particular patient when the information is outdated | free storage resources |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | user | list out all of the patients and their contact information | |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | intermediate user | add appointment information for a patient | easily schedule an appointment and find free time slot for it |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | intermediate user | delete appointment for a patient | free up slots if the patient is unable to attend |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | intermediate user | list out all of the appointments | |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"javierng2knus"},"content":"| `* * *` | user | list out all of the information about a particular patient | see the detailed information of the patient |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | add the medical information for the patient | allow the doctor to better treat the patient |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | delete the medical information for a patient when the information is outdated | free storage resources |","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | list out all of the patients and their medical information | |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | modify the medical details of a patient | keep the patient\u0027s medical information updated |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | modify the basic information of a patient | keep the patient\u0027s basic information updated |","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | modify the contact information of a patient | keep the patient\u0027s contact information updated |","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | modify the appointment details of a patient | keep the patient\u0027s appointment information updated |","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | undo the most recent change or command if possible | fix any errors made |","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"javierng2knus"},"content":"| `* *` | user | view all of the appointments for the day | |","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"javierng2knus"},"content":"| `* *` | intermediate user | list out specifically the medication that the patient is currently taking | |","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"javierng2knus"},"content":"| `* *` | intermediate user | modify the patient\u0027s current medication | better track the medication plan of the patient |","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"javierng2knus"},"content":"| `* *` | intermediate user | list out specifically the patient\u0027s allergies | prescribe the appropriate medication |","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"javierng2knus"},"content":"| `* *` | intermediate user | modify the patient\u0027s allergies | |","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"javierng2knus"},"content":"| `* *` | intermediate user | list out specifically the past illnesses of the patient | assist in the diagnosis process |","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"javierng2knus"},"content":"| `* *` | intermediate user | modify the patient\u0027s past illnesses upon the previous appointment | |","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"Ella-e"},"content":"| `* *` | expert user | have short forms of existing commands | save time on typing the commands |","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"Ella-e"},"content":"| `*` | new user | have the ability to switch to a more simplified and beginner friendly UI | more effectively learn the basics |","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"javierng2knus"},"content":"| `*` | new user | have interactive elements in the user guide | easily understand the app\u0027s capabilities |","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"javierng2knus"},"content":"| `*` | new user | be given command suggestions for mistyped commands | type the intended command without needing to refer to the user guide |","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"javierng2knus"},"content":"| `*` | user | add a reminder for an appointment | be aware of the appointment while busy with work |","lastModifiedDate":"2024-03-06"},{"lineNumber":323,"author":{"gitId":"javierng2knus"},"content":"| `*` | user | mark a reminder as done or undone | better track done and undone work |","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"javierng2knus"},"content":"| `*` | user | mark some of the patients as the special focus | better track patients in serious conditions |","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"javierng2knus"},"content":"| `*` | user | have the ability to leave comments or annotations on shared patient records | communicate specific insights or recommendations to my colleagues |","lastModifiedDate":"2024-03-06"},{"lineNumber":326,"author":{"gitId":"javierng2knus"},"content":"| `*` | user | have a way to assign specific colors to specific medical terms | better skim through the information |","lastModifiedDate":"2024-03-06"},{"lineNumber":327,"author":{"gitId":"javierng2knus"},"content":"| `*` | user | have a method for showing tooltips of features when hovered | quickly find out information about the feature without needing other references |","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"javierng2knus"},"content":"| `*` | user | have a method of giving feedback to the developers | share aspects of the product that I would like changes to |","lastModifiedDate":"2024-03-06"},{"lineNumber":329,"author":{"gitId":"javierng2knus"},"content":"| `*` | intermediate user | have an efficient way to export and backup patient data | ensure the safety and accessibility of important information |","lastModifiedDate":"2024-03-06"},{"lineNumber":330,"author":{"gitId":"javierng2knus"},"content":"| `*` | intermediate user | export selected patient\u0027s information | give the information to the doctor or the patient when needed |","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"javierng2knus"},"content":"| `*` | intermediate user | export selected medical instructions | easily share the instructions to the patient|","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"javierng2knus"},"content":"| `*` | doctor | be able to set a set of instructions for the assistants for special cases such as performing lung capacity tests for asmatics | so that they are aware of the procedures to go through before my consultation with the patient |","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"Ella-e"},"content":"(For all use cases below, the **System** is the `VitalConnect` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"Ella-e"},"content":"**Use case: UC1 - Add a patient**","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"Ella-e"},"content":"1. User requests to add a patient by keying the patient\u0027s name and NRIC in the command.","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect adds the patient\u0027s name and NRIC.","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"Ella-e"},"content":"* 1a. The NRIC already exists in the system.","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays warning message and the existing patient\u0027s information.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"Ella-e"},"content":"* 1b. The NRIC or name entered is invalid.","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"Ella-e"},"content":"**Use case: UC2 - Delete a patient**","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"Ella-e"},"content":"1. User requests to delete a patient by keying the patient\u0027s name or NRIC in the command.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect deletes the patient from database.","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"Ella-e"},"content":"* 1a. The patient doesn\u0027t exist in the system.","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"Ella-e"},"content":"**Use case: UC3 - Add an appointment**","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"Ella-e"},"content":"1. User requests to add an appointment for a patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect add the appointment to the database under this patient\u0027s NRIC.","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Ella-e"},"content":"* 1a. Critical information (time and doctor) missing in the appointment.","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"Ella-e"},"content":"* 1b. The assigned patient doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"Ella-e"},"content":"* 1c. The appointment time crashes with existing time.","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"Ella-e"},"content":" * 1c1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"Ella-e"},"content":" * 1c1. VitalConnect displays the appointment with crashing time.","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"Ella-e"},"content":"**Use case: UC4 - Delete an appointment**","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"Ella-e"},"content":"1. User requests to delete an appointment for a patient.","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect removes the appointment from the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"Ella-e"},"content":"* 1a. The assigned patient or the appointment doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"Ella-e"},"content":"**Use case: UC5 - Modify an appointment**","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":390,"author":{"gitId":"Ella-e"},"content":"1. User requests to modify an appointment for a patient by keying the appointment\u0027s id.","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"Ella-e"},"content":"2. VitalConnect displays the detail of the appointment to be modified.","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Ella-e"},"content":"3. User specify which field to be modified and enters the new information.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"Ella-e"},"content":"4. VitalConnect saves the new appointment information.","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"Ella-e"},"content":"5. VitalConnect displays the updated detail of the appointment modified.","lastModifiedDate":"2024-03-04"},{"lineNumber":395,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"Ella-e"},"content":"* 1a. The appointment refered by the id doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":398,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":399,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":400,"author":{"gitId":"Ella-e"},"content":"* 1b. The id is not a valid number.","lastModifiedDate":"2024-03-04"},{"lineNumber":401,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":402,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":403,"author":{"gitId":"Ella-e"},"content":"* 3a. The field to be modified is unrecognized.","lastModifiedDate":"2024-03-04"},{"lineNumber":404,"author":{"gitId":"Ella-e"},"content":" * 3a1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"Ella-e"},"content":" * 3a2. VitalConnect request for valid field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"Ella-e"},"content":" * 3a3. User enters new field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"Ella-e"},"content":" Steps 3a1-3a3 are repeated until the data entered are correct.","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"Ella-e"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"Ella-e"},"content":"* 3b. The new information is in invalid form or contains invalid character.","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"Ella-e"},"content":" * 3b1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"Ella-e"},"content":" * 3b2. VitalConnect request for valid data entry.","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"Ella-e"},"content":" * 3b3. User enters new field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"Ella-e"},"content":" Steps 3b1-3b3 are repeated until the data entered are valid.","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"Ella-e"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"Ella-e"},"content":"* 3c. The appointment time crashes with existing time.","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"Ella-e"},"content":" * 3c1. VitalConnect displays an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"Ella-e"},"content":" * 3c2. VitalConnect displays the appointment with crashing time.","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"Ella-e"},"content":" * 3c3. VitalConnect request for valid data entry.","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"Ella-e"},"content":" * 3c4. User enters new field information.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"Ella-e"},"content":" Steps 3c1-3c4 are repeated until the time doesn\u0027t crash.","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"Ella-e"},"content":" Use case resumes from step 4.","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"javierng2knus"},"content":"**Use case: UC6 - Add specific information for a patient**","lastModifiedDate":"2024-03-06"},{"lineNumber":424,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":425,"author":{"gitId":"javierng2knus"},"content":"1. User requests to add specific information for a patient.","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"javierng2knus"},"content":"2. VitalConnect save the specific information to the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":427,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":428,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":429,"author":{"gitId":"Ella-e"},"content":"* 1a. The patient doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-04"},{"lineNumber":430,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"javierng2knus"},"content":"* 1b. The information is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"javierng2knus"},"content":"**Use case: UC7 - Delete specific information**","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":438,"author":{"gitId":"javierng2knus"},"content":"1. User requests to delete specific information for a patient.","lastModifiedDate":"2024-03-06"},{"lineNumber":439,"author":{"gitId":"javierng2knus"},"content":"2. VitalConnect remove the specific information to the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":440,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":441,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"javierng2knus"},"content":"* 1a. The patient or specific information doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":443,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"javierng2knus"},"content":"**Use case: UC8 - Modify specific information**","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"Ella-e"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":448,"author":{"gitId":"javierng2knus"},"content":"1. User requests to modify specific information for a patient.","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"author":{"gitId":"javierng2knus"},"content":"2. VitalConnect displays the updated specific information of the patient.","lastModifiedDate":"2024-03-06"},{"lineNumber":450,"author":{"gitId":"Ella-e"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":451,"author":{"gitId":"Ella-e"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":452,"author":{"gitId":"javierng2knus"},"content":"* 1a. The patient or specific information doesn\u0027t exist in the database.","lastModifiedDate":"2024-03-06"},{"lineNumber":453,"author":{"gitId":"Ella-e"},"content":" * 1a1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":454,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":455,"author":{"gitId":"javierng2knus"},"content":"* 1b. The specific information is invalid.","lastModifiedDate":"2024-03-06"},{"lineNumber":456,"author":{"gitId":"Ella-e"},"content":" * 1b1. VitalConnect displays a warning message.","lastModifiedDate":"2024-03-04"},{"lineNumber":457,"author":{"gitId":"Ella-e"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"Ella-e"},"content":"# Technical Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":462,"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":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"Ella-e"},"content":"# Performance Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":465,"author":{"gitId":"Ella-e"},"content":"1. Should be able to hold up to 100 patients with 1000 appointments without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-04"},{"lineNumber":466,"author":{"gitId":"Ella-e"},"content":"2. The system should respond within 3 seconds.","lastModifiedDate":"2024-03-04"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":468,"author":{"gitId":"Ella-e"},"content":"# Quality Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":469,"author":{"gitId":"Ella-e"},"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-04"},{"lineNumber":470,"author":{"gitId":"Ella-e"},"content":"2. System should be robust for any form of data file crashes and invalid user input.","lastModifiedDate":"2024-03-04"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":472,"author":{"gitId":"Ella-e"},"content":"# Scope","lastModifiedDate":"2024-03-04"},{"lineNumber":473,"author":{"gitId":"Ella-e"},"content":"1. The product will \u003cstrong\u003eNOT\u003c/strong\u003e enforce any form of protection of the generated data file containing patients\u0027 information. The organization should be responsible for ensuring the safety of their patient\u0027s data.","lastModifiedDate":"2024-03-04"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":475,"author":{"gitId":"Ella-e"},"content":"# Process Requirements","lastModifiedDate":"2024-03-04"},{"lineNumber":476,"author":{"gitId":"Ella-e"},"content":"1. The project is expected to grow in breadth-first iterative process.","lastModifiedDate":"2024-03-04"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":481,"author":{"gitId":"SeaHogs"},"content":"* **CLI**: Acronym for Command Line Interface, a text-based interface where users interact with the application by typing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"SeaHogs"},"content":"* **VitalConnect**: The system being described, representing the medical management application.","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"SeaHogs"},"content":"* **Use Case**: A specific scenario or situation in which a user interacts with the VitalConnect system to achieve a specific goal.","lastModifiedDate":"2024-03-06"},{"lineNumber":484,"author":{"gitId":"SeaHogs"},"content":"* **MSS (Main Success Scenario)**: The primary sequence of steps in a use case that represents the successful accomplishment of the user\u0027s goal.","lastModifiedDate":"2024-03-06"},{"lineNumber":485,"author":{"gitId":"SeaHogs"},"content":"* **Extensions**: Additional scenarios that may occur during the execution of a use case, usually describing alternative paths or error-handling situations.","lastModifiedDate":"2024-03-06"},{"lineNumber":486,"author":{"gitId":"SeaHogs"},"content":"* **NRIC**: National Registration Identity Card, a unique identification number used in some countries.","lastModifiedDate":"2024-03-06"},{"lineNumber":487,"author":{"gitId":"SeaHogs"},"content":"* **Database**: A structured set of data stored electronically, in this context, referring to the storage system for patient and appointment information.","lastModifiedDate":"2024-03-06"},{"lineNumber":488,"author":{"gitId":"SeaHogs"},"content":"* **Appointment**: A scheduled meeting or arrangement, often referring to a scheduled medical consultation in the context of VitalConnect.","lastModifiedDate":"2024-03-06"},{"lineNumber":489,"author":{"gitId":"SeaHogs"},"content":"* **Field**: In the context of modifying an appointment, a specific piece of information within the appointment details that the user can choose to modify (e.g., time, doctor).","lastModifiedDate":"2024-03-06"},{"lineNumber":490,"author":{"gitId":"SeaHogs"},"content":"* **ID (Identification Number)**: A unique identifier associated with a specific appointment, used to distinguish and reference individual appointments.","lastModifiedDate":"2024-03-06"},{"lineNumber":491,"author":{"gitId":"SeaHogs"},"content":"* **Warning Message**: An alert displayed by the VitalConnect system to notify the user of a potential issue or discrepancy.","lastModifiedDate":"2024-03-06"},{"lineNumber":492,"author":{"gitId":"SeaHogs"},"content":"* **Error Message**: A notification displayed by the VitalConnect system to inform the user about a critical issue or mistake.","lastModifiedDate":"2024-03-06"},{"lineNumber":493,"author":{"gitId":"SeaHogs"},"content":"* **Crashing Time**: A situation where the proposed time for an appointment conflicts with an existing appointment time in the system.","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"SeaHogs"},"content":"* **Invalid Data Entry**: Information entered by the user that does not meet the required format or criteria.","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"SeaHogs"},"content":"* **Valid Data Entry**: Information entered by the user that meets the required format or criteria.","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"javierng2knus"},"content":"* **Tooltip**: A common graphical user interface element in which, when hovering over a screen element or component, a text box displays information about that element.","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"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":505,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"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":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"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":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"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":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"javierng2knus":54,"Ella-e":124,"-":356,"SeaHogs":15}},{"path":"docs/team/ella-e.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"layout: page","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"title: Mu Zhaoyu\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"## Project: VitalConnect","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"This product is doctors or any healthcare workers that have to keep track of a lot ","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"of patient information and requires the information at a fast pace, ","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"thus preferring to have a simple UI such as a CLI instead of a complex GUI, ","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":"### **New Feature**: ","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"1. __Create an appointment__","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to create an appointment for a patient with the time and date.","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"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-04"},{"lineNumber":22,"author":{"gitId":"Ella-e"},"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-04"},{"lineNumber":23,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":"2. __Delete an appointment__","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to delete an appointment by specifying the appointment index and the patient\u0027s name.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":"3. __List appointments__","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to list out all the upcoming appointments that ordering by time.","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":"### **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":"User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"* Added documentation for the features `Create Appointments`, `Delete Appointments` and `List Appointments` [\\#72]()","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"Ella-e":42}},{"path":"docs/team/mayuehan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"MaYuehan"},"content":"---","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"MaYuehan"},"content":"layout: page","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"MaYuehan"},"content":"title: Ma Yuehan\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"MaYuehan"},"content":"---","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"MaYuehan"},"content":"## Project: VitalConnect","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"MaYuehan"},"content":"This product is doctors or any healthcare workers that have to keep track of a lot ","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"MaYuehan"},"content":"of patient information and requires the information at a fast pace, ","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"MaYuehan"},"content":"thus preferring to have a simple UI such as a CLI instead of a complex GUI, ","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"MaYuehan"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"MaYuehan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"MaYuehan"},"content":"### **New Feature**: ","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"MaYuehan"},"content":"1. __Create an appointment__","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"MaYuehan"},"content":"* What it does: allows the user to create an appointment for a patient with the time and date.","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"MaYuehan"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"MaYuehan"},"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-25"},{"lineNumber":22,"author":{"gitId":"MaYuehan"},"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-25"},{"lineNumber":23,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"MaYuehan"},"content":"2. __Delete an appointment__","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"MaYuehan"},"content":"* What it does: allows the user to delete an appointment by specifying the appointment index and the patient\u0027s name.","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"MaYuehan"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"MaYuehan"},"content":"* Credits:","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"MaYuehan"},"content":"3. __List appointments__","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"MaYuehan"},"content":"* What it does: allows the user to list out all the upcoming appointments that ordering by time.","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"MaYuehan"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"MaYuehan"},"content":"* Credits:","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"MaYuehan"},"content":"### **Documentation**:","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"MaYuehan"},"content":"User Guide:","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"MaYuehan"},"content":"* Added documentation for the features `Create Appointments`, `Delete Appointments` and `List Appointments` [\\#72]()","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"MaYuehan"},"content":"","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"MaYuehan":42}},{"path":"docs/team/seahogs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"Ella-e"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Ella-e"},"content":"title: Mu Zhaoyu\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Ella-e"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Ella-e"},"content":"## Project: VitalConnect","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Ella-e"},"content":"This product is doctors or any healthcare workers that have to keep track of a lot","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Ella-e"},"content":"of patient information and requires the information at a fast pace,","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Ella-e"},"content":"thus preferring to have a simple UI such as a CLI instead of a complex GUI,","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Ella-e"},"content":"with the added benefit of having typed user commands for an even faster retrieval of information.","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Ella-e"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Ella-e"},"content":"### **New Feature**:","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"Ella-e"},"content":"1. __Create an appointment__","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to create an appointment for a patient with the time and date.","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"Ella-e"},"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":22,"author":{"gitId":"Ella-e"},"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":23,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"Ella-e"},"content":"2. __Delete an appointment__","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to delete an appointment by specifying the appointment index and the patient\u0027s name.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"Ella-e"},"content":"3. __List appointments__","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"Ella-e"},"content":"* What it does: allows the user to list out all the upcoming appointments that ordering by time.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"Ella-e"},"content":"* Justification: This feature improves the product significantly as it is the fundamental functions for the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"Ella-e"},"content":"* Credits:","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"Ella-e"},"content":"### **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"Ella-e"},"content":"User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"Ella-e"},"content":"* Added documentation for the features `Create Appointments`, `Delete Appointments` and `List Appointments` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"Ella-e"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Ella-e":42}}] diff --git a/AY2324S2-CS2103T-W08-2_tp_master/commits.json b/AY2324S2-CS2103T-W08-2_tp_master/commits.json index 7583c3b7..3c8dfbf5 100644 --- a/AY2324S2-CS2103T-W08-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-W08-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"javierng2knus":[{"date":"2024-03-06","commitResults":[{"hash":"088a7db21464bbc65dd5ada35bae72aefe113f5c","isMergeCommit":false,"messageTitle":"Update the AboutUs page","messageBody":"Update the AboutUs page to include my own information and image.\n\nResponsibility is left blank as the responsibilities will need to properly reassigned in a future date.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"MaYuehan":[{"date":"2024-02-25","commitResults":[{"hash":"c65d82151bc280716b9fe72527033275eaa16b67","isMergeCommit":false,"messageTitle":"Update Readme and AboutUs Modify the Readme file, add more details about the project and the features we plan to achieve for v1.2. Also modify the AboutUs file, add the information of mine. Create my profile file and link to AboutUs.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":130,"deletions":6}}}]},{"date":"2024-03-06","commitResults":[{"hash":"7fd6a869df3d4935a1cdd906d8ac21c98fc820be","isMergeCommit":false,"messageTitle":"Update readme and AboutUs Delete the sample of Address book from Readme. Add image named mayuehan into image and edit the image part in AboutUs.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":26}}},{"hash":"effe75474d4334331c1a13f10376981c9109a230","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-Readme","messageBody":"","fileTypesAndContributionMap":{}}]}],"Ella-e":[{"date":"2024-03-04","commitResults":[{"hash":"88928392b502c29986859c42ae863abd6c573eb0","isMergeCommit":false,"messageTitle":"Update NFRs to the DG","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":580,"deletions":0},"docs":{"insertions":15,"deletions":4}}},{"hash":"9f1b36aa95883a953e163177c02b608df0fc9741","isMergeCommit":true,"messageTitle":"Merge","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"80330bd7de96af545b73b260d978a38b4266f6a6","isMergeCommit":false,"messageTitle":"Update User Story","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":35,"deletions":9}}},{"hash":"8c20a6b890d2562d007f15710a1ea3c12180f395","isMergeCommit":false,"messageTitle":"Update Use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":116,"deletions":20}}},{"hash":"ea0a4cfa9b5323ceedb52cbba54a5d32884e0cc3","isMergeCommit":true,"messageTitle":"Merge branch \u0027developer-guide\u0027","messageBody":"Update the User Story and Use case section of the Developer Guide.\n","fileTypesAndContributionMap":{}},{"hash":"c63f5bed507ded44d8db7c5c1629e76f3abdfe27","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"Update the local fork version.\n","fileTypesAndContributionMap":{}},{"hash":"0eeaf9201a4b1469e3efbcb845059af5d4367e48","isMergeCommit":false,"messageTitle":"Update information into AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":4}}},{"hash":"9fbb4d4dc65acefe4ee86a183dd670e9ff309840","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"Update\n","fileTypesAndContributionMap":{}},{"hash":"44996ce5a2e991f37a33d3531a15411b9f8e9f0e","isMergeCommit":false,"messageTitle":"Update personal portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bcc32e95b7a5e5632b2a489b2a073676a227a8ce","isMergeCommit":false,"messageTitle":"Update target user profile and value proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"aebdbf70e060d353fe083a3d30d3daffc2db481f","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin\u0027 into developer-guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"8d21bf7b902030a121658161e4dfaab7765a9ede","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into developer-guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"ead282bc2fdba495b980e4d32537f61a8fa45004","isMergeCommit":true,"messageTitle":"Merge pull request #34 from javierng2knus/javierng2knus-aboutus","messageBody":"Update the AboutUs page","fileTypesAndContributionMap":{}},{"hash":"07eecd85bcea003773547341ccf254978cee3d48","isMergeCommit":true,"messageTitle":"Merge pull request #35 from javierng2knus/javierng2knus-site-wide-settings","messageBody":"Update site-wide settings","fileTypesAndContributionMap":{}},{"hash":"bf6da7a548d2bcfbb52935169998544620e16bac","isMergeCommit":true,"messageTitle":"Merge pull request #36 from SeaHogs/branch-Glossary","messageBody":"Update Glossary","fileTypesAndContributionMap":{}},{"hash":"40b61e4372606ae89ae88ae6af69dd748ce4b517","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into developer-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f3869d9bea83dd9b01630e3ccbc081009fbaddb3","isMergeCommit":false,"messageTitle":"Update DG product scope","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":1}}},{"hash":"e8b1281f6bdf8b7b9e7179d98af3f871433290cd","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":14}}},{"hash":"ca3c72266c153d99fd7d5062ed280b8342dfca18","isMergeCommit":false,"messageTitle":"Update style","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"97388bf99d416e6af9d3ee8c4c9da96b3ec1375d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-Readme","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"32c35287e6d205489752fe43c4ff1c349d4d4cee","isMergeCommit":true,"messageTitle":"Merge pull request #37 from MaYuehan/branch-Readme","messageBody":"Update Readme and AboutUs","fileTypesAndContributionMap":{}}]}],"SeaHogs":[{"date":"2024-03-04","commitResults":[{"hash":"149a1660765b9560dd0c1fb9eac105199da52033","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Ella-e/master","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"730cbb618f6a85fb57b37f018abc6ed847b48b8a","isMergeCommit":true,"messageTitle":"Merge pull request #30 from Ella-e/master","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"95f4da98a946559d17367443dca4c426cf2baea1","isMergeCommit":false,"messageTitle":"Update Glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":0}}},{"hash":"9153f3263421a320e7f350a1c64c035cbe222a03","isMergeCommit":true,"messageTitle":"Merge pull request #32 from Ella-e/developer-guide","messageBody":"Update target user profile and value proposition","fileTypesAndContributionMap":{}},{"hash":"3859484d8d836ab9e57270e127aa24b2509d754c","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Ella-e/aboutus","messageBody":"Update Aboutus","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"javierng2knus":{"docs":6,"functional-code":0,"test-code":0},"MaYuehan":{"docs":126,"functional-code":0,"test-code":0},"Ella-e":{"docs":260,"functional-code":0,"test-code":0,"other":580},"SeaHogs":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"javierng2knus":10.224853,"MaYuehan":1323.9288,"Ella-e":49517.305,"SeaHogs":20.52071},"authorDisplayNameMap":{"javierng2knus":"CS2103T-W08-2 NG W..VIER","MaYuehan":"CS2103T-W08-2 MA Y..EHAN","Ella-e":"CS2103T-W08-2 MU Z..AOYU","SeaHogs":"CS2103T-W08-2 LAI ..IWEN"}} +{"authorDailyContributionsMap":{"javierng2knus":[{"date":"2024-03-06","commitResults":[{"hash":"088a7db21464bbc65dd5ada35bae72aefe113f5c","isMergeCommit":false,"messageTitle":"Update the AboutUs page","messageBody":"Update the AboutUs page to include my own information and image.\n\nResponsibility is left blank as the responsibilities will need to properly reassigned in a future date.\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"4c25caf37a37b349d57c0caaca6fce688aa74c51","isMergeCommit":false,"messageTitle":"Update the developer guide","messageBody":"Update the DeveloperGuide.md file to update user stories, use cases and glossary.\n\nThe user stories are now more organized and more cohesive with the phrasing. Additional user stories were also added or removed.\n\nThe use cases are now more general to account for the similar uses for adding/removing/modifying of different types of information.\n\nThe glossary had some unnecessary terms and was missing the term \u0027tooltip\u0027.\n","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":46}}}]}],"MaYuehan":[{"date":"2024-02-25","commitResults":[{"hash":"c65d82151bc280716b9fe72527033275eaa16b67","isMergeCommit":false,"messageTitle":"Update Readme and AboutUs Modify the Readme file, add more details about the project and the features we plan to achieve for v1.2. Also modify the AboutUs file, add the information of mine. Create my profile file and link to AboutUs.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":130,"deletions":6}}}]},{"date":"2024-03-06","commitResults":[{"hash":"7fd6a869df3d4935a1cdd906d8ac21c98fc820be","isMergeCommit":false,"messageTitle":"Update readme and AboutUs Delete the sample of Address book from Readme. Add image named mayuehan into image and edit the image part in AboutUs.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":26}}},{"hash":"effe75474d4334331c1a13f10376981c9109a230","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-Readme","messageBody":"","fileTypesAndContributionMap":{}}]}],"Ella-e":[{"date":"2024-03-04","commitResults":[{"hash":"88928392b502c29986859c42ae863abd6c573eb0","isMergeCommit":false,"messageTitle":"Update NFRs to the DG","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":580,"deletions":0},"docs":{"insertions":15,"deletions":4}}},{"hash":"9f1b36aa95883a953e163177c02b608df0fc9741","isMergeCommit":true,"messageTitle":"Merge","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"80330bd7de96af545b73b260d978a38b4266f6a6","isMergeCommit":false,"messageTitle":"Update User Story","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":35,"deletions":9}}},{"hash":"8c20a6b890d2562d007f15710a1ea3c12180f395","isMergeCommit":false,"messageTitle":"Update Use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":116,"deletions":20}}},{"hash":"ea0a4cfa9b5323ceedb52cbba54a5d32884e0cc3","isMergeCommit":true,"messageTitle":"Merge branch \u0027developer-guide\u0027","messageBody":"Update the User Story and Use case section of the Developer Guide.\n","fileTypesAndContributionMap":{}},{"hash":"c63f5bed507ded44d8db7c5c1629e76f3abdfe27","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"Update the local fork version.\n","fileTypesAndContributionMap":{}},{"hash":"0eeaf9201a4b1469e3efbcb845059af5d4367e48","isMergeCommit":false,"messageTitle":"Update information into AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":4}}},{"hash":"9fbb4d4dc65acefe4ee86a183dd670e9ff309840","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027","messageBody":"Update\n","fileTypesAndContributionMap":{}},{"hash":"44996ce5a2e991f37a33d3531a15411b9f8e9f0e","isMergeCommit":false,"messageTitle":"Update personal portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bcc32e95b7a5e5632b2a489b2a073676a227a8ce","isMergeCommit":false,"messageTitle":"Update target user profile and value proposition","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":2}}},{"hash":"aebdbf70e060d353fe083a3d30d3daffc2db481f","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin\u0027 into developer-guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"8d21bf7b902030a121658161e4dfaab7765a9ede","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into developer-guide","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"ead282bc2fdba495b980e4d32537f61a8fa45004","isMergeCommit":true,"messageTitle":"Merge pull request #34 from javierng2knus/javierng2knus-aboutus","messageBody":"Update the AboutUs page","fileTypesAndContributionMap":{}},{"hash":"07eecd85bcea003773547341ccf254978cee3d48","isMergeCommit":true,"messageTitle":"Merge pull request #35 from javierng2knus/javierng2knus-site-wide-settings","messageBody":"Update site-wide settings","fileTypesAndContributionMap":{}},{"hash":"bf6da7a548d2bcfbb52935169998544620e16bac","isMergeCommit":true,"messageTitle":"Merge pull request #36 from SeaHogs/branch-Glossary","messageBody":"Update Glossary","fileTypesAndContributionMap":{}},{"hash":"40b61e4372606ae89ae88ae6af69dd748ce4b517","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into developer-guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f3869d9bea83dd9b01630e3ccbc081009fbaddb3","isMergeCommit":false,"messageTitle":"Update DG product scope","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":1}}},{"hash":"e8b1281f6bdf8b7b9e7179d98af3f871433290cd","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":14}}},{"hash":"ca3c72266c153d99fd7d5062ed280b8342dfca18","isMergeCommit":false,"messageTitle":"Update style","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"97388bf99d416e6af9d3ee8c4c9da96b3ec1375d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-Readme","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"32c35287e6d205489752fe43c4ff1c349d4d4cee","isMergeCommit":true,"messageTitle":"Merge pull request #37 from MaYuehan/branch-Readme","messageBody":"Update Readme and AboutUs","fileTypesAndContributionMap":{}},{"hash":"624881afcbb7fd3f7fd5485765deaa5de55dd71e","isMergeCommit":true,"messageTitle":"Merge pull request #40 from javierng2knus/javierng2knus-developer-guide","messageBody":"Update the developer guide","fileTypesAndContributionMap":{}}]}],"SeaHogs":[{"date":"2024-03-04","commitResults":[{"hash":"149a1660765b9560dd0c1fb9eac105199da52033","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Ella-e/master","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"730cbb618f6a85fb57b37f018abc6ed847b48b8a","isMergeCommit":true,"messageTitle":"Merge pull request #30 from Ella-e/master","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"95f4da98a946559d17367443dca4c426cf2baea1","isMergeCommit":false,"messageTitle":"Update Glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":0}}},{"hash":"9153f3263421a320e7f350a1c64c035cbe222a03","isMergeCommit":true,"messageTitle":"Merge pull request #32 from Ella-e/developer-guide","messageBody":"Update target user profile and value proposition","fileTypesAndContributionMap":{}},{"hash":"3859484d8d836ab9e57270e127aa24b2509d754c","isMergeCommit":true,"messageTitle":"Merge pull request #38 from Ella-e/aboutus","messageBody":"Update Aboutus","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"javierng2knus":{"docs":60,"functional-code":0,"test-code":0},"MaYuehan":{"docs":126,"functional-code":0,"test-code":0},"Ella-e":{"docs":217,"functional-code":0,"test-code":0,"other":580},"SeaHogs":{"docs":15,"functional-code":0,"test-code":0}},"authorContributionVariance":{"javierng2knus":890.6982,"MaYuehan":1323.9288,"Ella-e":49517.305,"SeaHogs":20.52071},"authorDisplayNameMap":{"javierng2knus":"CS2103T-W08-2 NG W..VIER","MaYuehan":"CS2103T-W08-2 MA Y..EHAN","Ella-e":"CS2103T-W08-2 MU Z..AOYU","SeaHogs":"CS2103T-W08-2 LAI ..IWEN"}} diff --git a/AY2324S2-CS2103T-W08-3_tp_master/authorship.json b/AY2324S2-CS2103T-W08-3_tp_master/authorship.json index fe51488c..111f1df4 100644 --- a/AY2324S2-CS2103T-W08-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W08-3_tp_master/authorship.json @@ -1 +1 @@ -[] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W08-3/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp/graph/badge.svg?token\u003dNSJUXEXG4R)](https://codecov.io/gh/AY2324S2-CS2103T-W08-3/tp)","lastModifiedDate":"2024-02-12"},{"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":"ChuaZiLong"},"content":"* This is **a project to help make it easy to manage our contacts**.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"ChuaZiLong"},"content":" * recall a classmate\u0027s project role","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"ChuaZiLong"},"content":" * schedule a meeting with a study group","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ChuaZiLong"},"content":"* The project aims to alleviate the common challenge of remembering and managing the myriad of connections we accumulate, especially in academic and professional settings.","lastModifiedDate":"2024-03-05"},{"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":"ChuaZiLong"},"content":"* It is named `Student Contact Manager` because it helps to store contact details.","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"ChuaZiLong"},"content":"* For the detailed documentation of this project, see the **[Student Contact Manager Website](https://ay2324s2-cs2103t-w08-3.github.io/tp/)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"ChuaZiLong"},"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":{"-":7,"ChuaZiLong":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":"-"},"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":"-"},"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":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"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":"-"},"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":"ChuaZiLong"},"content":"### Chua Zi Long","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"ChuaZiLong"},"content":"\u003cimg src\u003d\"images/chuazilong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"ChuaZiLong"},"content":"[[github](https://github.com/ChuaZiLong)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"ChuaZiLong"},"content":"[[portfolio](team/zilong.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"ChuaZiLong"},"content":"* Responsibilities: README + Site-wide Settings + Exporting Data","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"-":56,"ChuaZiLong":5}},{"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":"ChuaZiLong"},"content":"* Proficient with the use of a computer","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"ChuaZiLong"},"content":"* Seeks an efficient way to manage a significant number of contacts within their academic and professional circles","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":294,"author":{"gitId":"-"},"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":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"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":298,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"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":"-"},"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":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"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":335,"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":336,"author":{"gitId":"ChuaZiLong"},"content":"3. Designed for users who can type fast, making command execution quicker than using a mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":343,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":353,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":354,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"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":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"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":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"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":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"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":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"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":388,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":395,"ChuaZiLong":3}},{"path":"docs/team/zilong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ChuaZiLong"},"content":"# Chua Zi Long","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"ChuaZiLong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"ChuaZiLong"},"content":"## Profile/Summary","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"ChuaZiLong"},"content":"Current Year 2 Computer Science and Mathematics Double Degree student from the National University of Singapore.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"ChuaZiLong":4}}] diff --git a/AY2324S2-CS2103T-W08-3_tp_master/commits.json b/AY2324S2-CS2103T-W08-3_tp_master/commits.json index 044fc90f..96888232 100644 --- a/AY2324S2-CS2103T-W08-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W08-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"wilsonwid":[],"tahsinhasem":[],"ChuaZiLong":[],"sarjinius":[]},"authorFileTypeContributionMap":{"wilsonwid":{"docs":0,"functional-code":0,"test-code":0},"tahsinhasem":{"docs":0,"functional-code":0,"test-code":0},"ChuaZiLong":{"docs":0,"functional-code":0,"test-code":0},"sarjinius":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"wilsonwid":0.0,"tahsinhasem":0.0,"ChuaZiLong":0.0,"sarjinius":0.0},"authorDisplayNameMap":{"wilsonwid":"CS2103T-W08-3 WILS..HANA","tahsinhasem":"CS2103T-W08-3 AONI..ASEM","ChuaZiLong":"CS2103T-W08-3 CHUA..LONG","sarjinius":"CS2103T-W08-3 SARJ..BONA"}} +{"authorDailyContributionsMap":{"wilsonwid":[{"date":"2024-03-06","commitResults":[{"hash":"919ce8137e880425033368ee7c4b8e81e7e36aba","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZiLong/master","messageBody":" Update README, AboutUs and personal information","fileTypesAndContributionMap":{}}]}],"tahsinhasem":[],"ChuaZiLong":[{"date":"2024-03-05","commitResults":[{"hash":"a71e2038f147da2ef743ad5b8ba83799487fe183","isMergeCommit":false,"messageTitle":"Update README, AboutUs and personal information","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":13}}},{"hash":"44d23f80316ec3d35ad6497856af3b2ec3a7b4d7","isMergeCommit":false,"messageTitle":"Add new line at EOF","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"803eefa59d4185da362df006f54c1f594c890e30","isMergeCommit":false,"messageTitle":"Change path in aboutus to my picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"sarjinius":[]},"authorFileTypeContributionMap":{"wilsonwid":{"docs":0,"functional-code":0,"test-code":0},"tahsinhasem":{"docs":0,"functional-code":0,"test-code":0},"ChuaZiLong":{"docs":20,"functional-code":0,"test-code":0},"sarjinius":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"wilsonwid":0.0,"tahsinhasem":0.0,"ChuaZiLong":81.56213,"sarjinius":0.0},"authorDisplayNameMap":{"wilsonwid":"CS2103T-W08-3 WILS..HANA","tahsinhasem":"CS2103T-W08-3 AONI..ASEM","ChuaZiLong":"CS2103T-W08-3 CHUA..LONG","sarjinius":"CS2103T-W08-3 SARJ..BONA"}} diff --git a/AY2324S2-CS2103T-W09-1_tp_master/commits.json b/AY2324S2-CS2103T-W09-1_tp_master/commits.json index decea4fd..f2aa4d73 100644 --- a/AY2324S2-CS2103T-W09-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W09-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"LimZiJia":[],"moguries":[],"gosongying":[],"GERARDJM018":[]},"authorFileTypeContributionMap":{"LimZiJia":{"docs":0,"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":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"LimZiJia":0.0,"moguries":0.0,"gosongying":0.0,"GERARDJM018":0.0},"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":{}}]}],"moguries":[],"gosongying":[],"GERARDJM018":[]},"authorFileTypeContributionMap":{"LimZiJia":{"docs":0,"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":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"LimZiJia":61942.44,"moguries":0.0,"gosongying":0.0,"GERARDJM018":0.0},"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-4_tp_master/authorship.json b/AY2324S2-CS2103T-W09-4_tp_master/authorship.json index 644d8835..9110cf47 100644 --- a/AY2324S2-CS2103T-W09-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W09-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","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":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"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":"Greg-Tan"},"content":"### Greg Tan","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Greg-Tan"},"content":"\u003cimg src\u003d\"images/greg.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Greg-Tan"},"content":"[[github](http://github.com/Greg-Tan)]","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"Greg-Tan"},"content":"[[portfolio](team/greg.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Greg-Tan"},"content":"* Role: Developer","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"youdonnnn"},"content":"### Loh Yu Tong","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"youdonnnn"},"content":"\u003cimg src\u003d\"images/youdonnnn.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"youdonnnn"},"content":"[[github](https://github.com/youdonnnn)]","lastModifiedDate":"2024-03-04"},{"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":"-"},"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":"irwynliong"},"content":"\u003cimg src\u003d\"images/irwynliong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"irwynliong"},"content":"[[github](http://github.com/irwynliong)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"irwynliong"},"content":"[[portfolio](team/irwyn.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"irwynliong"},"content":"* Responsibilities: Deliverables \u0026 Integration","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"youdonnnn":3,"irwynliong":4,"Greg-Tan":5,"-":49}},{"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":"irwynliong"},"content":"# InsureBook Developer Guide","lastModifiedDate":"2024-03-05"},{"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":"irwynliong"},"content":"**Target user profile**: An insurance Agent who","lastModifiedDate":"2024-03-05"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"irwynliong"},"content":"* has a need to manage a significant number of contacts and their policies","lastModifiedDate":"2024-03-05"},{"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":"irwynliong"},"content":"* Needs a one application to schedule his appointments and reminds him about it","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"irwynliong"},"content":"**Value proposition**: Assist Insurance Agent keep track of their clients and new clients. ","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"irwynliong"},"content":"This provides them with a 1 application to add details about their clients insurance plans and ","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"irwynliong"},"content":"set reminders for meetups with clients.","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":"irwynliong"},"content":"| Priority | As a …​ | I can …​ | So that I can…​ |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"irwynliong"},"content":"|----------|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | add clients contact details into the address book | I can keep track of my clients |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | delete clients contact details in the address book | |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | edit details of the contact | I can update clients detail |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | search for contact details | |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"irwynliong"},"content":"| `* *` | insurance agent | add clients insurances and policies | I can keep track of my clients policies and insurances |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"irwynliong"},"content":"| `*` | organised insurance agent | tag different clients in the contact details as different tiers | I can focus on bigger clients, i.e. Clients with higher premium policies will have higher priority over others |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | delete clients insurances and policies | |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | untag clients in contact details | |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | search for clients with specified policies\tI can keep track of who has the specified policies which may have an update | |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | edit details of the client\u0027s policies and insurances\tI can update myself on any changes made when my clients\u0027 update their policies | |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"irwynliong"},"content":"| | experienced insurance agent\t | make notes about my clients\tI can remember details about my clients and better connect to them and their needs when we meet up | |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | automatically calculate my clients\u0027 total coverages\tI can easily check if they have any shortfall in coverage | |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"irwynliong"},"content":"| | forgetful insurance agent | \tadd meeting date/time in the address book\tI can organise my day and meeting time with the client | |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"irwynliong"},"content":"| | organised insurance agent | \tform a organisational chart of my clients\tI can easily see which of my clients are giving more referrals | |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"irwynliong"},"content":"| | inexperienced tech user | \tperform actions such as adding and deleting details with ease\tI can focus on my work as an agent and not worry about having to troubleshoot technical problems | |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"irwynliong"},"content":"| | forgetful insurance agent | \tset weekly/monthly reminders to set up meetings with particular clients\tI won\u0027t forget about not setting up meetings with my clients to check on their life updates and review their policies | |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"irwynliong"},"content":"| | organised insurance agent | \thave todo lists for each of my clients\tI can keep track of the things I have to do for each client | |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"irwynliong"},"content":"| | forgetful insurance agent | \tadd deadlines to tasks in my clients\u0027 todo list\tI can be aware of when these tasks need to be completed | |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"irwynliong"},"content":"| | efficient insurance agent | \tsort my tasks by deadline\tI can quickly see my most urgent tasks at a glance and get them done first | |","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"irwynliong"},"content":"| | organised insurance agent | \tsort my clients by their insurance companies\tI can group clients under the same company together and possibly complete overlapping tasks involving the company | |","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"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":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","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":"### 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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":356,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":366,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":367,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"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":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"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":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"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":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"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":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"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":401,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"irwynliong":29,"-":382}},{"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":"youdonnnn"},"content":"InsureBook 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":"2024-03-05"},{"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":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"youdonnnn"},"content":"Adds a client, together with their name, phone number and email into the address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"youdonnnn"},"content":"Format: `add n/\u003cname\u003e p/\u003cphone number\u003e e/\u003cemail\u003e ","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"youdonnnn"},"content":"* `add n/Gregorius p/91234567 e/giddy@gmail.com`","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"youdonnnn"},"content":"* `add n/Rahrahsan p/90019001 e/rahrah@outlook.com`","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"youdonnnn"},"content":"* `add n/Jim p/88888888 e/jimtyms@yahoo.com`","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"youdonnnn"},"content":"Removes an existing client based on their index from the address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"youdonnnn"},"content":"Format: `delete \u003cperson index\u003e`","lastModifiedDate":"2024-03-05"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"youdonnnn"},"content":"* `delete 2`","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"youdonnnn"},"content":"* `delete 4`","lastModifiedDate":"2024-03-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"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":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":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":113,"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":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":121,"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":122,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"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":125,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"youdonnnn":10,"-":117}},{"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":"irwynliong"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eInsureBook\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":"irwynliong"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W09-4/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"irwynliong":2,"-":65}},{"path":"docs/team/greg.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Greg-Tan"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"Greg-Tan"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"Greg-Tan"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"Greg-Tan"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"Greg-Tan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"Greg-Tan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"Greg-Tan"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"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":"Greg-Tan"},"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":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"Greg-Tan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"Greg-Tan"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"Greg-Tan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"Greg-Tan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"Greg-Tan"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"Greg-Tan"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"Greg-Tan"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"Greg-Tan"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"Greg-Tan"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"Greg-Tan"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"Greg-Tan"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"Greg-Tan"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"Greg-Tan"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"Greg-Tan"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"Greg-Tan"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"Greg-Tan"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"Greg-Tan"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"Greg-Tan"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"Greg-Tan"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Greg-Tan":46}},{"path":"docs/team/irwyn.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"irwynliong"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"irwynliong"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"irwynliong"},"content":" title: \"Irwyn Liong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"irwynliong"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"irwynliong"},"content":"### Project: InsureBook","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"irwynliong"},"content":"InsureBook is a desktop application that assist insurance agents manage their client\u0027s contact and policies as well as to set reminders and schedule meetings with client.","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"irwynliong"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX. ","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"irwynliong"},"content":"It is written in Java, and has about 10 kLoC. This project is based on [AddressBook - Level 3](https://se-education.org/addressbook-level3/).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"irwynliong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"irwynliong"},"content":"### Features","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"irwynliong"},"content":"1. **New Feature**:","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"irwynliong"},"content":"\u003cdiv style\u003d\"page-break-after: always;\"\u003e\u003c/div\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"irwynliong"},"content":"### Code Contributed","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"irwynliong"},"content":"[RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"irwynliong"},"content":"### Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"irwynliong"},"content":"* User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"irwynliong"},"content":" * Added documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"irwynliong"},"content":"* Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"irwynliong"},"content":" * Added use case section","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"irwynliong"},"content":"### Project Management","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"irwynliong"},"content":"* Contributed to Issue tracker and PR reviews","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"irwynliong"},"content":"### Community","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"irwynliong"},"content":"* PRs reviewed","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"irwynliong":33}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jimseah-0116"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W09-4/tp/actions/workflows/gradle.yml/badge.svg?branch\u003dmaster)](https://github.com/AY2324S2-CS2103T-W09-4/tp/actions/workflows/gradle.yml/)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jimseah-0116"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jimseah-0116"},"content":"# InsureBook","lastModifiedDate":"2024-03-06"},{"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":"jimseah-0116"},"content":"## Description","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jimseah-0116"},"content":"``InsureBook`` is a simple desktop application that allows insurance agents to easily keep track of potential and existing clients, their policies, and scheduled appointment dates. \u003cbr\u003e It is a GUI application with user interactions that are mostly CLI-based.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jimseah-0116"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jimseah-0116"},"content":"## Features","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jimseah-0116"},"content":"* Add \u0026 delete clients\u0027 information (Name, phone number, email address, policy information)","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jimseah-0116"},"content":"* View list of clients in the main GUI window, including their name, phone number, and email address","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jimseah-0116"},"content":"* View a client\u0027s policy information in a separate pop-up window","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jimseah-0116"},"content":"* Track scheduled meetings and appointments","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jimseah-0116"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jimseah-0116"},"content":"## Site Map","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jimseah-0116"},"content":"* **[InsureBook Product Website](https://ay2324s2-cs2103t-w09-4.github.io/tp/)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jimseah-0116"},"content":"* **[InsureBook - User Guide](https://ay2324s2-cs2103t-w09-4.github.io/tp/UserGuide.html)**","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jimseah-0116"},"content":"* **[InsureBook - Developer Guide](https://ay2324s2-cs2103t-w09-4.github.io/tp/DeveloperGuide.html)**","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jimseah-0116"},"content":"* **[InsureBook - About Us](https://ay2324s2-cs2103t-w09-4.github.io/tp/AboutUs.html)**","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jimseah-0116"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jimseah-0116"},"content":"## Credits \u0026 Acknowledgements","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jimseah-0116"},"content":"- This project was made as part of CS2103T in AY23/24 S2.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jimseah-0116"},"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":{"jimseah-0116":21,"-":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":"","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":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"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":"Greg-Tan"},"content":"### Greg Tan","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Greg-Tan"},"content":"\u003cimg src\u003d\"images/greg.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Greg-Tan"},"content":"[[github](http://github.com/Greg-Tan)]","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"Greg-Tan"},"content":"[[portfolio](team/greg.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Greg-Tan"},"content":"* Role: Developer","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"youdonnnn"},"content":"### Loh Yu Tong","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"youdonnnn"},"content":"\u003cimg src\u003d\"images/youdonnnn.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"youdonnnn"},"content":"[[github](https://github.com/youdonnnn)]","lastModifiedDate":"2024-03-04"},{"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":"-"},"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":"irwynliong"},"content":"\u003cimg src\u003d\"images/irwynliong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"irwynliong"},"content":"[[github](http://github.com/irwynliong)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"irwynliong"},"content":"[[portfolio](team/irwyn.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"irwynliong"},"content":"* Responsibilities: Deliverables \u0026 Integration","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"youdonnnn":3,"irwynliong":4,"Greg-Tan":5,"-":49}},{"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":"irwynliong"},"content":"# InsureBook Developer Guide","lastModifiedDate":"2024-03-05"},{"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":"irwynliong"},"content":"**Target user profile**: An insurance Agent who","lastModifiedDate":"2024-03-05"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"irwynliong"},"content":"* has a need to manage a significant number of contacts and their policies","lastModifiedDate":"2024-03-05"},{"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":"irwynliong"},"content":"* Needs a one application to schedule his appointments and reminds him about it","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"irwynliong"},"content":"**Value proposition**: Assist Insurance Agent keep track of their clients and new clients. ","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"irwynliong"},"content":"This provides them with a 1 application to add details about their clients insurance plans and ","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"irwynliong"},"content":"set reminders for meetups with clients.","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":"irwynliong"},"content":"| Priority | As a …​ | I can …​ | So that I can…​ |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"irwynliong"},"content":"|----------|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | add clients contact details into the address book | I can keep track of my clients |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | delete clients contact details in the address book | |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | edit details of the contact | I can update clients detail |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"irwynliong"},"content":"| `* * *` | insurance agent | search for contact details | |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"irwynliong"},"content":"| `* *` | insurance agent | add clients insurances and policies | I can keep track of my clients policies and insurances |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"irwynliong"},"content":"| `*` | organised insurance agent | tag different clients in the contact details as different tiers | I can focus on bigger clients, i.e. Clients with higher premium policies will have higher priority over others |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | delete clients insurances and policies | |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | untag clients in contact details | |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | search for clients with specified policies\tI can keep track of who has the specified policies which may have an update | |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | edit details of the client\u0027s policies and insurances\tI can update myself on any changes made when my clients\u0027 update their policies | |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"irwynliong"},"content":"| | experienced insurance agent\t | make notes about my clients\tI can remember details about my clients and better connect to them and their needs when we meet up | |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"irwynliong"},"content":"| | insurance agent\t | automatically calculate my clients\u0027 total coverages\tI can easily check if they have any shortfall in coverage | |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"irwynliong"},"content":"| | forgetful insurance agent | \tadd meeting date/time in the address book\tI can organise my day and meeting time with the client | |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"irwynliong"},"content":"| | organised insurance agent | \tform a organisational chart of my clients\tI can easily see which of my clients are giving more referrals | |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"irwynliong"},"content":"| | inexperienced tech user | \tperform actions such as adding and deleting details with ease\tI can focus on my work as an agent and not worry about having to troubleshoot technical problems | |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"irwynliong"},"content":"| | forgetful insurance agent | \tset weekly/monthly reminders to set up meetings with particular clients\tI won\u0027t forget about not setting up meetings with my clients to check on their life updates and review their policies | |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"irwynliong"},"content":"| | organised insurance agent | \thave todo lists for each of my clients\tI can keep track of the things I have to do for each client | |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"irwynliong"},"content":"| | forgetful insurance agent | \tadd deadlines to tasks in my clients\u0027 todo list\tI can be aware of when these tasks need to be completed | |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"irwynliong"},"content":"| | efficient insurance agent | \tsort my tasks by deadline\tI can quickly see my most urgent tasks at a glance and get them done first | |","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"irwynliong"},"content":"| | organised insurance agent | \tsort my clients by their insurance companies\tI can group clients under the same company together and possibly complete overlapping tasks involving the company | |","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"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":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","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":"### 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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":356,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":364,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":370,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":373,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"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":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":385,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"rahhulleee"},"content":"\t 1. Download the JAR file and copy into an empty folder. See the [Quick Start](UserGuide.md#quick-start) section in the User Guide for the link to download the JAR file.","lastModifiedDate":"2024-03-06"},{"lineNumber":389,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"rahhulleee"},"content":"\t 2. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2024-03-06"},{"lineNumber":391,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":392,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"rahhulleee"},"content":"2. Saving window preferences","lastModifiedDate":"2024-03-06"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"\t1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"rahhulleee"},"content":"\t2. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":399,"author":{"gitId":"-"},"content":"\tExpected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":403,"author":{"gitId":"rahhulleee"},"content":"3. Exiting the Application (Shutdown)","lastModifiedDate":"2024-03-06"},{"lineNumber":404,"author":{"gitId":"rahhulleee"},"content":"\t1. Type in \"Exit\" in the main command bar of the AddressBook.","lastModifiedDate":"2024-03-06"},{"lineNumber":405,"author":{"gitId":"rahhulleee"},"content":"\t","lastModifiedDate":"2024-03-06"},{"lineNumber":406,"author":{"gitId":"rahhulleee"},"content":"\t2. Else, manually close the Application","lastModifiedDate":"2024-03-06"},{"lineNumber":407,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":408,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":413,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"\t 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"rahhulleee"},"content":"\t 2. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":419,"author":{"gitId":"-"},"content":"\t\tExpected: 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":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"rahhulleee"},"content":"\t 3. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":423,"author":{"gitId":"-"},"content":"\t\t\tExpected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"rahhulleee"},"content":"\t 4. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":426,"author":{"gitId":"-"},"content":"\t\tExpected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":429,"author":{"gitId":"rahhulleee"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":430,"author":{"gitId":"rahhulleee"},"content":"2. Deleting a person from an empty AddressBook","lastModifiedDate":"2024-03-06"},{"lineNumber":431,"author":{"gitId":"rahhulleee"},"content":"\t1. Prerequisites: List all persons using the `list` command. The list should be empty.","lastModifiedDate":"2024-03-06"},{"lineNumber":432,"author":{"gitId":"rahhulleee"},"content":"\t","lastModifiedDate":"2024-03-06"},{"lineNumber":433,"author":{"gitId":"rahhulleee"},"content":"\t2. Test case: `delete x`","lastModifiedDate":"2024-03-06"},{"lineNumber":434,"author":{"gitId":"rahhulleee"},"content":"\t\t","lastModifiedDate":"2024-03-06"},{"lineNumber":435,"author":{"gitId":"rahhulleee"},"content":"\t\tExpected: An Error should pop up and Error details will be shown in the status message. Shows that the storage is functioning properly.","lastModifiedDate":"2024-03-06"},{"lineNumber":436,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"rahhulleee"},"content":" ","lastModifiedDate":"2024-03-06"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"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":"rahhulleee"},"content":"\t 1. Stimulating a corrupted/missing data file","lastModifiedDate":"2024-03-06"},{"lineNumber":445,"author":{"gitId":"rahhulleee"},"content":"\t\t 1. Close the application if it\u0027s running.","lastModifiedDate":"2024-03-06"},{"lineNumber":446,"author":{"gitId":"rahhulleee"},"content":"\t\t 2. Navigate to the file containing the data of the AddressBook which is located in `/data/addressbook.json`","lastModifiedDate":"2024-03-06"},{"lineNumber":447,"author":{"gitId":"rahhulleee"},"content":"\t\t 3. Delete or rename this json file and this will corrupt it","lastModifiedDate":"2024-03-06"},{"lineNumber":448,"author":{"gitId":"rahhulleee"},"content":"\t\t 4. Exit and relaunch the application","lastModifiedDate":"2024-03-06"},{"lineNumber":449,"author":{"gitId":"-"},"content":"\t\t\t ","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"rahhulleee"},"content":"\t\t\t Expected: The application should detect that the data file is missing and the whole addressbook would be empty, and the commands will still be working in the empty AddressBook without any crashes. This ensures that the application can still be used even if the data file gets deleted.","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"irwynliong":29,"-":375,"rahhulleee":46}},{"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":"youdonnnn"},"content":"InsureBook 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":"2024-03-05"},{"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":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"youdonnnn"},"content":"Adds a client, together with their name, phone number and email into the address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"Greg-Tan"},"content":"Format: add n/NAME p/PHONENUMBER e/EMAIL","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"youdonnnn"},"content":"* `add n/Gregorius p/91234567 e/giddy@gmail.com`","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"youdonnnn"},"content":"* `add n/Rahrahsan p/90019001 e/rahrah@outlook.com`","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"youdonnnn"},"content":"* `add n/Jim p/88888888 e/jimtyms@yahoo.com`","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"youdonnnn"},"content":"Removes an existing client based on their index from the address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"Greg-Tan"},"content":"* The index **must be a positive integer between the numeric range of contacts in the address book.** ","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"youdonnnn"},"content":"* `delete 2`","lastModifiedDate":"2024-03-05"},{"lineNumber":98,"author":{"gitId":"youdonnnn"},"content":"* `delete 4`","lastModifiedDate":"2024-03-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"Greg-Tan"},"content":"### Adding a new policy to a person : `addPolicy`","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"Greg-Tan"},"content":"Adds new insurance policy to a specific client","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"Greg-Tan"},"content":"Format: `addPolicy i/INDEX n/POLICY`","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":106,"author":{"gitId":"Greg-Tan"},"content":"* Adds a policy to the person at the specified `INDEX`.","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"Greg-Tan"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-06"},{"lineNumber":108,"author":{"gitId":"Greg-Tan"},"content":"* The index **must be a positive integer between the numeric range of contacts in the address book.**","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"Greg-Tan"},"content":"* `POLICY` is the name of the policy to be added","lastModifiedDate":"2024-03-06"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":111,"author":{"gitId":"Greg-Tan"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":112,"author":{"gitId":"Greg-Tan"},"content":"* `addPolicy i/10 n/SuperSaver`","lastModifiedDate":"2024-03-06"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":114,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"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":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":125,"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":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"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":134,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"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":137,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"youdonnnn":8,"Greg-Tan":11,"-":120}},{"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":"irwynliong"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eInsureBook\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":"irwynliong"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W09-4/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"irwynliong":2,"-":65}},{"path":"docs/team/greg.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Greg-Tan"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"Greg-Tan"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"Greg-Tan"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"Greg-Tan"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"Greg-Tan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"Greg-Tan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"Greg-Tan"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"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":"Greg-Tan"},"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":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"Greg-Tan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"Greg-Tan"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"Greg-Tan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"Greg-Tan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"Greg-Tan"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"Greg-Tan"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"Greg-Tan"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"Greg-Tan"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"Greg-Tan"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"Greg-Tan"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"Greg-Tan"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"Greg-Tan"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"Greg-Tan"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"Greg-Tan"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"Greg-Tan"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Greg-Tan"},"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":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"Greg-Tan"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"Greg-Tan"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"Greg-Tan"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"Greg-Tan"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"Greg-Tan"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Greg-Tan":46}},{"path":"docs/team/irwyn.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"irwynliong"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"irwynliong"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"irwynliong"},"content":" title: \"Irwyn Liong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"irwynliong"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"irwynliong"},"content":"### Project: InsureBook","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"irwynliong"},"content":"InsureBook is a desktop application that assist insurance agents manage their client\u0027s contact and policies as well as to set reminders and schedule meetings with client.","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"irwynliong"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX. ","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"irwynliong"},"content":"It is written in Java, and has about 10 kLoC. This project is based on [AddressBook - Level 3](https://se-education.org/addressbook-level3/).","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"irwynliong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"irwynliong"},"content":"### Features","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"irwynliong"},"content":"1. **New Feature**:","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"irwynliong"},"content":"\u003cdiv style\u003d\"page-break-after: always;\"\u003e\u003c/div\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"irwynliong"},"content":"### Code Contributed","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"irwynliong"},"content":"[RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"irwynliong"},"content":"### Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"irwynliong"},"content":"* User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"irwynliong"},"content":" * Added documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"irwynliong"},"content":"* Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"irwynliong"},"content":" * Added use case section","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"irwynliong"},"content":"### Project Management","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"irwynliong"},"content":"* Contributed to Issue tracker and PR reviews","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"irwynliong"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"irwynliong"},"content":"### Community","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"irwynliong"},"content":"* PRs reviewed","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"irwynliong":33}}] diff --git a/AY2324S2-CS2103T-W09-4_tp_master/commits.json b/AY2324S2-CS2103T-W09-4_tp_master/commits.json index 815a232b..582667cb 100644 --- a/AY2324S2-CS2103T-W09-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-W09-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"youdonnnn":[{"date":"2024-03-04","commitResults":[{"hash":"4996e9bef60a4636dadd30a85c8b04084f5bc533","isMergeCommit":false,"messageTitle":"Add personal particulars into AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"cd02c017202b93d900f6f4ed9e60aa125456de4b","isMergeCommit":false,"messageTitle":"Edit features of the UG to match InsureBook","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":88}}},{"hash":"154927f443f3330afcd68724a76f353e76fb0a55","isMergeCommit":true,"messageTitle":"Merge pull request #17 from youdonnnn/update-AboutUs-page","messageBody":"Add personal particulars into AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"76d839ae199eeaf7b52c883d404543ee4b35351f","isMergeCommit":true,"messageTitle":"Merge pull request #28 from Greg-Tan/update-AboutUs","messageBody":"Update AboutUs to include Greg details","fileTypesAndContributionMap":{}}]}],"jimseah-0116":[{"date":"2024-03-05","commitResults":[{"hash":"2d01c364e15a8f433834b47f84ec82bbdb4cd4aa","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"79efdcf0a76b4d3719f9e36864ca4e1e91a410ce","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":10}}},{"hash":"49b93bf89f573f9cefdd50f9d994289dac47b380","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W09-4:master\u0027 into update-ReadME","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c96b597181b8961bad7cf3d64a4a8584492627b8","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fa447de5f64c973b78e591dc2486e5132f0ed7af","isMergeCommit":true,"messageTitle":"Merge pull request #21 from youdonnnn/edit-UG-features","messageBody":"Edit features of the UG to match InsureBook","fileTypesAndContributionMap":{}},{"hash":"742f857bb26c40b97d4954e6060bbb148c9c775d","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W09-4:master\u0027 into update-ReadME","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3662c4ab144635850a53e3b6f2d98020cee6b6d4","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f52128df17b7e1e2e93e3ac8a249593e3a25b50b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":20}}}]}],"irwynliong":[{"date":"2024-02-29","commitResults":[{"hash":"523946313b999c2d08b8affa140e97e79543c4fb","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-W09-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"eb6b454e3337ea16af5f428110fe3e5ec3ecda26","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"def0bd72d1f46fa8d59d7c70e84aa017b9c8abf4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into edit-UG-features","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8a6b8264878998f2e04216b93b7a776899c85a67","isMergeCommit":false,"messageTitle":"Add about us and portfolio, edit abit of the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":67,"deletions":20}}},{"hash":"45c5ef83517d4a3019c8c3bab47a0a7c8e2d7e3a","isMergeCommit":true,"messageTitle":"Merge pull request #26 from irwynliong/branch-aboutus-and-DG","messageBody":"Add about us and portfolio, edit abit of the DG","fileTypesAndContributionMap":{}}]}],"Greg-Tan":[{"date":"2024-03-05","commitResults":[{"hash":"c3040bc127e82c5e832ab6568571604f12141d16","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of github.com-Greg-Tan:Greg-Tan/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7a790b5a9b9b9663b4b2e2c982434c020da8afa0","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W09-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"957875a349390a4f3b7578111537befc28e3ffc3","isMergeCommit":false,"messageTitle":"Add greg details to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}}]}],"rahhulleee":[]},"authorFileTypeContributionMap":{"youdonnnn":{"docs":13,"functional-code":0,"test-code":0},"jimseah-0116":{"docs":0,"functional-code":0,"test-code":0},"irwynliong":{"docs":68,"functional-code":0,"test-code":0},"Greg-Tan":{"docs":51,"functional-code":0,"test-code":0},"rahhulleee":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"youdonnnn":743.1875,"jimseah-0116":441.2222,"irwynliong":576.0764,"Greg-Tan":239.55554,"rahhulleee":0.0},"authorDisplayNameMap":{"youdonnnn":"CS2103T-W09-4 LOH ..TONG","jimseah-0116":"CS2103T-W09-4 JIM ..SEAH","irwynliong":"CS2103T-W09-4 LION..RWYN","Greg-Tan":"CS2103T-W09-4 GREG..MING","rahhulleee":"CS2103T-W09-4 SITH..AHUL"}} +{"authorDailyContributionsMap":{"youdonnnn":[{"date":"2024-03-04","commitResults":[{"hash":"4996e9bef60a4636dadd30a85c8b04084f5bc533","isMergeCommit":false,"messageTitle":"Add personal particulars into AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"cd02c017202b93d900f6f4ed9e60aa125456de4b","isMergeCommit":false,"messageTitle":"Edit features of the UG to match InsureBook","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":88}}},{"hash":"154927f443f3330afcd68724a76f353e76fb0a55","isMergeCommit":true,"messageTitle":"Merge pull request #17 from youdonnnn/update-AboutUs-page","messageBody":"Add personal particulars into AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"76d839ae199eeaf7b52c883d404543ee4b35351f","isMergeCommit":true,"messageTitle":"Merge pull request #28 from Greg-Tan/update-AboutUs","messageBody":"Update AboutUs to include Greg details","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"d050324bdd4a1305b9b023ded04d9381515717cc","isMergeCommit":true,"messageTitle":"Merge pull request #31 from jimseah-0116/update-ReadME","messageBody":"Update README","fileTypesAndContributionMap":{}}]}],"jimseah-0116":[{"date":"2024-03-05","commitResults":[{"hash":"2d01c364e15a8f433834b47f84ec82bbdb4cd4aa","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"79efdcf0a76b4d3719f9e36864ca4e1e91a410ce","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":10}}},{"hash":"49b93bf89f573f9cefdd50f9d994289dac47b380","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W09-4:master\u0027 into update-ReadME","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c96b597181b8961bad7cf3d64a4a8584492627b8","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fa447de5f64c973b78e591dc2486e5132f0ed7af","isMergeCommit":true,"messageTitle":"Merge pull request #21 from youdonnnn/edit-UG-features","messageBody":"Edit features of the UG to match InsureBook","fileTypesAndContributionMap":{}},{"hash":"742f857bb26c40b97d4954e6060bbb148c9c775d","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W09-4:master\u0027 into update-ReadME","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3662c4ab144635850a53e3b6f2d98020cee6b6d4","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f52128df17b7e1e2e93e3ac8a249593e3a25b50b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":20}}}]},{"date":"2024-03-06","commitResults":[{"hash":"dd123bb78b331793bb3c063172643f80f99f0bcf","isMergeCommit":true,"messageTitle":"Merge pull request #30 from rahhulleee/branch-Developer-Guide","messageBody":"V1.1 Iteration Manual Testing Appendix Edits","fileTypesAndContributionMap":{}},{"hash":"71a4eb83bdef00e30a4c35c60c19c1546e8b6e93","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":11}}}]}],"irwynliong":[{"date":"2024-02-29","commitResults":[{"hash":"523946313b999c2d08b8affa140e97e79543c4fb","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-W09-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"eb6b454e3337ea16af5f428110fe3e5ec3ecda26","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"def0bd72d1f46fa8d59d7c70e84aa017b9c8abf4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into edit-UG-features","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8a6b8264878998f2e04216b93b7a776899c85a67","isMergeCommit":false,"messageTitle":"Add about us and portfolio, edit abit of the DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":67,"deletions":20}}},{"hash":"45c5ef83517d4a3019c8c3bab47a0a7c8e2d7e3a","isMergeCommit":true,"messageTitle":"Merge pull request #26 from irwynliong/branch-aboutus-and-DG","messageBody":"Add about us and portfolio, edit abit of the DG","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"de59d1b9ec5af18e51c4382a2e46c41f1a15c5c9","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Greg-Tan/branch-editFeatures-UG","messageBody":"Edit features of user guide to include addPolicy command","fileTypesAndContributionMap":{}}]}],"Greg-Tan":[{"date":"2024-03-05","commitResults":[{"hash":"c3040bc127e82c5e832ab6568571604f12141d16","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of github.com-Greg-Tan:Greg-Tan/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7a790b5a9b9b9663b4b2e2c982434c020da8afa0","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W09-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"957875a349390a4f3b7578111537befc28e3ffc3","isMergeCommit":false,"messageTitle":"Add greg details to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}}]},{"date":"2024-03-06","commitResults":[{"hash":"4c28aea1bc528ba46f34592d987fa0c4c78381b8","isMergeCommit":false,"messageTitle":"Edit features of user guide to include addPolicy command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":5}}}]}],"rahhulleee":[{"date":"2024-03-06","commitResults":[{"hash":"7ebc5655049732a7523830804687c48031dffaf6","isMergeCommit":false,"messageTitle":"V1.1 Iteration Manual Testing Appendix","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":19}}}]}]},"authorFileTypeContributionMap":{"youdonnnn":{"docs":11,"functional-code":0,"test-code":0},"jimseah-0116":{"docs":21,"functional-code":0,"test-code":0},"irwynliong":{"docs":68,"functional-code":0,"test-code":0},"Greg-Tan":{"docs":62,"functional-code":0,"test-code":0},"rahhulleee":{"docs":46,"functional-code":0,"test-code":0}},"authorContributionVariance":{"youdonnnn":691.4557,"jimseah-0116":454.05914,"irwynliong":535.66864,"Greg-Tan":242.46153,"rahhulleee":420.99408},"authorDisplayNameMap":{"youdonnnn":"CS2103T-W09-4 LOH ..TONG","jimseah-0116":"CS2103T-W09-4 JIM ..SEAH","irwynliong":"CS2103T-W09-4 LION..RWYN","Greg-Tan":"CS2103T-W09-4 GREG..MING","rahhulleee":"CS2103T-W09-4 SITH..AHUL"}} diff --git a/AY2324S2-CS2103T-W10-2_tp_master/authorship.json b/AY2324S2-CS2103T-W10-2_tp_master/authorship.json index d799c2ab..bb960d88 100644 --- a/AY2324S2-CS2103T-W10-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W10-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: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"### Lee Yi Lin","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"\u003cimg src\u003d\"images/yleeyilin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"yleeyilin"},"content":"[[github](https://github.com/yleeyilin)]","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"yleeyilin"},"content":"[[portfolio](team/yleeyilin.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"yleeyilin"},"content":"* Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"### James Sin","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":"\u003cimg src\u003d\"images/jamessinmaojun.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":"[[github](http://github.com/jamessinmaojun)]","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"jamessinmaojun"},"content":"[[portfolio](team/jamessinmaojun.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jamessinmaojun"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"jamessinmaojun"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"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":"-"},"content":"### Jean 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: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"### Chng Chia Geng","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"\u003cimg src\u003d\"images/chiageng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"[[github](http://github.com/chiageng)]","lastModifiedDate":"2024-03-01"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"[[portfolio](team/chiageng.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"jamessinmaojun":6,"chiageng":5,"-":40,"yleeyilin":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":"-"},"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":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"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":284,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC01 - Add Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a new contact is added into list`","lastModifiedDate":"2024-03-01"},{"lineNumber":300,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":301,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"yleeyilin"},"content":"1. User requests to add contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms success update.","lastModifiedDate":"2024-02-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the required field.","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects a duplicate name entry.","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters the correct command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until there is no duplicate entry in input.","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":324,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":325,"author":{"gitId":"chiageng"},"content":"* 1c. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":326,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":327,"author":{"gitId":"chiageng"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":328,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":329,"author":{"gitId":"chiageng"},"content":" * Steps 1c1 - 1c2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":330,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":331,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":332,"author":{"gitId":"chiageng"},"content":"* 1d. PoochPlanner detect unknown input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":333,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":334,"author":{"gitId":"chiageng"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":335,"author":{"gitId":"chiageng"},"content":" * 1d2. User re-enters the correct input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":336,"author":{"gitId":"chiageng"},"content":" * Steps 1d1 - 1d2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":337,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":338,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":339,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":342,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC02 - Delete Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":343,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":346,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is deleted from list`","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":348,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"yleeyilin"},"content":"1. User requests to delete contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":351,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner removes person and updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":352,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful deletion.","lastModifiedDate":"2024-02-29"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":357,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":358,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":359,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":360,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":361,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":362,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":363,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":364,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":365,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":366,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":367,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":368,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":369,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":370,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":371,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":372,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":373,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":374,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":375,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC03 - Edit Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":376,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":377,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":379,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is edited successfully in the list`","lastModifiedDate":"2024-03-01"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":381,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":382,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":383,"author":{"gitId":"yleeyilin"},"content":"1. User requests to edit the field of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates the field of specified person.","lastModifiedDate":"2024-02-29"},{"lineNumber":385,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":397,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":398,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":399,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":400,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":401,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":402,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":403,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":404,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":405,"author":{"gitId":"yleeyilin"},"content":"* 1c. User requests to edit the name field to a name that already exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":406,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":407,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":408,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the command with a different name.","lastModifiedDate":"2024-03-02"},{"lineNumber":409,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until the new name field is valid.","lastModifiedDate":"2024-02-29"},{"lineNumber":410,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":411,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":412,"author":{"gitId":"yleeyilin"},"content":"* 1d. User did not specify the field that they want to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":413,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":414,"author":{"gitId":"yleeyilin"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":415,"author":{"gitId":"yleeyilin"},"content":" * 1d2. User re-enters the command and specify the field/s to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":416,"author":{"gitId":"yleeyilin"},"content":" * Steps 1d1 - 1d2 are repeated until there exist a specified field to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":417,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":419,"author":{"gitId":"yleeyilin"},"content":"* 1e. User specified an invalid field.","lastModifiedDate":"2024-02-29"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":421,"author":{"gitId":"yleeyilin"},"content":" * 1e1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":422,"author":{"gitId":"yleeyilin"},"content":" * 1e2. User re-enters the command and edits a different field.","lastModifiedDate":"2024-02-29"},{"lineNumber":423,"author":{"gitId":"yleeyilin"},"content":" * Steps 1e1 - 1e2 are repeated until there exist a valid field in the input.","lastModifiedDate":"2024-02-29"},{"lineNumber":424,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":426,"author":{"gitId":"chiageng"},"content":"* 1f. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":427,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":428,"author":{"gitId":"chiageng"},"content":" * 1f1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":429,"author":{"gitId":"chiageng"},"content":" * 1f2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":430,"author":{"gitId":"chiageng"},"content":" * Steps 1f1 - 1f2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":431,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":432,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":433,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":434,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":435,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":436,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC04 - Search Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":437,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":438,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":439,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":440,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":441,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":442,"author":{"gitId":"yleeyilin"},"content":"1. User requests to search for the contact of a person with a keyword for a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":443,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner confirms successful search.","lastModifiedDate":"2024-02-29"},{"lineNumber":444,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner returns the sublist of contacts that contains the keyword specified by the user. ","lastModifiedDate":"2024-02-29"},{"lineNumber":445,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":446,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":453,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":454,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":455,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":456,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":457,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects multiple fields in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":458,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":459,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":460,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with only one field.","lastModifiedDate":"2024-02-29"},{"lineNumber":461,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":462,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":463,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":464,"author":{"gitId":"yleeyilin"},"content":"* 1c. PoochPlanner detects invalid field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":465,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":466,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":467,"author":{"gitId":"yleeyilin"},"content":" * 1c2. User re-enters a new command with another field.","lastModifiedDate":"2024-02-29"},{"lineNumber":468,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":469,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":470,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":471,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":472,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":473,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":474,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC05 - Help Tutorial`","lastModifiedDate":"2024-02-29"},{"lineNumber":475,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":476,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":477,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":478,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":479,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":480,"author":{"gitId":"yleeyilin"},"content":"1. User requests to learn more about the commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":481,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner displays a tutorial information.","lastModifiedDate":"2024-02-29"},{"lineNumber":482,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":483,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":484,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":485,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":486,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":487,"author":{"gitId":"yleeyilin"},"content":"* 1a. User requests to learn about an invalid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":488,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":489,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":490,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the command and request to learn about a valid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":491,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid command is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":492,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2. ","lastModifiedDate":"2024-02-29"},{"lineNumber":493,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":494,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":495,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"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":500,"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":501,"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":502,"author":{"gitId":"chiageng"},"content":"4. All code snippets presented in the developer guides shall follow a consistent coding style and formatting, adhering to the company\u0027s coding standards and best practices.","lastModifiedDate":"2024-03-01"},{"lineNumber":503,"author":{"gitId":"chiageng"},"content":"5. The developer guides shall undergo regular content audits, with outdated or deprecated information flagged for removal or revision, and new features or updates documented within one week of release.","lastModifiedDate":"2024-03-01"},{"lineNumber":504,"author":{"gitId":"chiageng"},"content":"6. The system should respond within 2 seconds.","lastModifiedDate":"2024-03-01"},{"lineNumber":505,"author":{"gitId":"chiageng"},"content":"7. The data should store locally and not accessible from other device for privacy issue.","lastModifiedDate":"2024-03-01"},{"lineNumber":506,"author":{"gitId":"chiageng"},"content":"8. The project is expected to adhere to schedule closely to deliver new feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":507,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"jamessinmaojun"},"content":"* **PoochPlanner**: An address book CLI software that stores contacts.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"jamessinmaojun"},"content":"* **PoochContact**: A contact that is stored in PoochPlanner.","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"\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":522,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"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":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"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":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"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":551,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"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":554,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"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":556,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"chiageng":36,"jamessinmaojun":2,"-":376,"yleeyilin":152}},{"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":"-"},"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":"chiageng"},"content":" * `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time` : Adds a staff contact named `Poochie` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag` : Adds a supplier contact named `PetCo` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr` : Adds a helper contact named `Tom Tan` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"* Words in `[parameter name]` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" e.g. in `/pooch-staff ; name : [name]`, `[name]` is a parameter which can be used as `/pooch-staff ; name : Poochie`.","lastModifiedDate":"2024-03-01"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"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":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" e.g. if the command specifies `name : [name] ; phone : [phone]`, `phone : [phone] ; name : [name]` is also acceptable.","lastModifiedDate":"2024-03-01"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"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":62,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"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":65,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"chiageng"},"content":"### Adding a contact: `Add`","lastModifiedDate":"2024-03-01"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"chiageng"},"content":"Adds a staff / supplier / helper to the address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"chiageng"},"content":"#### Adds a staff","lastModifiedDate":"2024-03-01"},{"lineNumber":81,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-staff ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; salary : [salary] ; employment : [part/full] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"chiageng"},"content":"#### Adds a supplier ","lastModifiedDate":"2024-03-01"},{"lineNumber":84,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-supplier ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; product : [product] ; price : [price] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":85,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"#### Adds a helper","lastModifiedDate":"2024-03-01"},{"lineNumber":87,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-maintenance ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; skill : [skill] ; commission : [commission] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":"* `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":"* `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":92,"author":{"gitId":"chiageng"},"content":"* `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"Constaints :","lastModifiedDate":"2024-03-01"},{"lineNumber":95,"author":{"gitId":"chiageng"},"content":"* `Duplicate name will not be allowed`","lastModifiedDate":"2024-03-01"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":"* `For instance, to check whether a name is unique (case-insensitive), we parse in the .lower() String method to convert all fields to lowercase.`","lastModifiedDate":"2024-03-01"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":"* `Name field is case-insensitive but space-sensitive`","lastModifiedDate":"2024-03-01"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"yleeyilin"},"content":"### Editing a person : `Edit`","lastModifiedDate":"2024-02-28"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"yleeyilin"},"content":"Edit the fields of the specified person in the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"yleeyilin"},"content":"Format: `/edit ; name : [NAME] ; field { [FIELD] : [VALUE] }`","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":105,"author":{"gitId":"yleeyilin"},"content":"* Edits the specified `field`(s) of the person with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":106,"author":{"gitId":"yleeyilin"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-28"},{"lineNumber":107,"author":{"gitId":"yleeyilin"},"content":"* At least one field must be provided. ","lastModifiedDate":"2024-02-28"},{"lineNumber":108,"author":{"gitId":"yleeyilin"},"content":"* More than one field can be updated at the same time.","lastModifiedDate":"2024-02-28"},{"lineNumber":109,"author":{"gitId":"yleeyilin"},"content":"* The field(s) to be edited must be a valid field within their contact type, i.e. Pooch Staff, Pooch Supplier, Pooch Maintenance).","lastModifiedDate":"2024-02-28"},{"lineNumber":110,"author":{"gitId":"yleeyilin"},"content":"* **_Caution_** : Editing `name` field to another name that already exists in Pooch Contact Book is strictly **not** allowed. ","lastModifiedDate":"2024-02-28"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"yleeyilin"},"content":"Examples: ","lastModifiedDate":"2024-02-28"},{"lineNumber":113,"author":{"gitId":"yleeyilin"},"content":"* `edit ; name : Poochie ; field : { name : Mochie }`","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"yleeyilin"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":115,"author":{"gitId":"yleeyilin"},"content":" The above command edits the name of the person, from **_Poochie_** to **_Mochie_**, given that there are no other persons with the name, **_Mochie_**, in the Pooch Contact Book. ","lastModifiedDate":"2024-02-28"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":117,"author":{"gitId":"yleeyilin"},"content":"* `edit ; name : Thomas ; field : { address : Poochie Street 25 ; employment : full-time }`","lastModifiedDate":"2024-02-28"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":119,"author":{"gitId":"yleeyilin"},"content":" The above command edits the address of **_Thomas_** to **_Poochie Street 25_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":120,"author":{"gitId":"yleeyilin"},"content":" The above command also edits the employment of **_Thomas_**, which **must** be a **_Pooch Staff_**, to **_full-time_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"jamessinmaojun"},"content":"Format: `/delete ; name : [NAME]`","lastModifiedDate":"2024-02-29"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"jamessinmaojun"},"content":"* Deletes the contact with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-29"},{"lineNumber":147,"author":{"gitId":"jamessinmaojun"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-29"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"jamessinmaojun"},"content":"* `delete ; name : Poochie`","lastModifiedDate":"2024-02-29"},{"lineNumber":151,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":152,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Poochie_**, provided **_Poochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":153,"author":{"gitId":"jamessinmaojun"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":154,"author":{"gitId":"jamessinmaojun"},"content":"* `delete ; name : Moochie`","lastModifiedDate":"2024-02-29"},{"lineNumber":155,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Moochie_**, provided **_Moochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"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":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":177,"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":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":180,"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":181,"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":182,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":184,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"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":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":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":199,"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":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":201,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":203,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"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":208,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"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":211,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"chiageng":24,"jamessinmaojun":11,"-":162,"yleeyilin":16}},{"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":"jamessinmaojun"},"content":" content: \"PoochPlanner\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"jamessinmaojun":1,"-":294}},{"path":"docs/team/chiageng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"layout: page","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"title: Chia Geng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"* **New Feature**: Added the ability to add contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" * What it does: allows the user to add a new contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" * Justification: This feature improves the product significantly because a user can store all contacts in this address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"chiageng"},"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-01"},{"lineNumber":16,"author":{"gitId":"chiageng"},"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-01"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" * Added documentation for the features `add` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" * Added non functional requirements.","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" * Updated use cases for PoochPlanner.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"chiageng":25}},{"path":"docs/team/jamessinmaojun.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"jamessinmaojun"},"content":"layout: page","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"jamessinmaojun"},"content":"title: James\u0027 Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"jamessinmaojun"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"jamessinmaojun"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"jamessinmaojun"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"jamessinmaojun"},"content":"* **New Feature**: Added the ability to delete contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"jamessinmaojun"},"content":" * What it does: allows the user to delete a certain contact, one at a time.","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"jamessinmaojun"},"content":" * Justification: This feature improves the product significantly because the address book can become too long and cluttered over time. Given the nature of the target users\u0027 business, contact turnover rate is expected to be very high and thus deleting unused contacts proves to be useful.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"jamessinmaojun"},"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-29"},{"lineNumber":16,"author":{"gitId":"jamessinmaojun"},"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":17,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"jamessinmaojun"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"jamessinmaojun"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":" * Added documentation for the feature `delete` [\\#29]()","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"jamessinmaojun"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":" * Added use cases for PoochPlanner [\\#30]()","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"jamessinmaojun":24}},{"path":"docs/team/yleeyilin.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"yleeyilin"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"yleeyilin"},"content":"title: Yi Lin\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"yleeyilin"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"yleeyilin"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"* **New Feature**: Added the ability to edit previous contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"yleeyilin"},"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":"yleeyilin"},"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":"yleeyilin"},"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":"yleeyilin"},"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":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"yleeyilin"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"yleeyilin"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"yleeyilin"},"content":" * Added documentation for the feature `edit` [\\#29]())","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"yleeyilin"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"yleeyilin"},"content":" * Added use cases for PoochPlanner [\\#30]())","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"yleeyilin":24}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"### PoochPlanner","lastModifiedDate":"2024-02-16"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"Joshy837"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Joshy837"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Joshy837"},"content":"**Target user:**","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Joshy837"},"content":"\u003eDog Cafe Owners","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Joshy837"},"content":"**Value proposition:**","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Joshy837"},"content":"\u003ePoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Joshy837"},"content":"**Project notes** (internal): see [here](https://docs.google.com/document/d/1Bgu3XEZ0F9Oq_5j4ah-QYcVjI2HHqYcvZwoivr9yC40/edit)","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Joshy837"},"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":{"Joshy837":13,"-":2}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"### Lee Yi Lin","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"\u003cimg src\u003d\"images/yleeyilin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"yleeyilin"},"content":"[[github](https://github.com/yleeyilin)]","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"yleeyilin"},"content":"[[portfolio](team/yleeyilin.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"yleeyilin"},"content":"* Role: Developer","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* Responsibilities: Code Quality","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"### James Sin","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":"\u003cimg src\u003d\"images/jamessinmaojun.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":"[[github](http://github.com/jamessinmaojun)]","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"jamessinmaojun"},"content":"[[portfolio](team/jamessinmaojun.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jamessinmaojun"},"content":"* Role: Developer","lastModifiedDate":"2024-02-29"},{"lineNumber":28,"author":{"gitId":"jamessinmaojun"},"content":"* Responsibilities: Documentation","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"jannaleong"},"content":"### Leong Jia Yi, Janna","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"jannaleong"},"content":"\u003cimg src\u003d\"images/jannaleong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"jannaleong"},"content":"[[github](http://github.com/jannaleong)] [[portfolio](team/jannaleong.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"jannaleong"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jannaleong"},"content":"* Responsibilities: Overall project coordination, deliverables and deadlines","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Joshy837"},"content":"### Joshua Yip Sujun","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"Joshy837"},"content":"\u003cimg src\u003d\"images/joshuayip.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"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":"Joshy837"},"content":"[[portfolio](team/joshuayip.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"Joshy837"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"chiageng"},"content":"### Chng Chia Geng","lastModifiedDate":"2024-03-01"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"chiageng"},"content":"\u003cimg src\u003d\"images/chiageng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":"[[github](http://github.com/chiageng)]","lastModifiedDate":"2024-03-01"},{"lineNumber":54,"author":{"gitId":"chiageng"},"content":"[[portfolio](team/chiageng.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"chiageng"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"Joshy837":4,"jamessinmaojun":6,"chiageng":5,"jannaleong":5,"-":31,"yleeyilin":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":"-"},"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":"jannaleong"},"content":"* Dog cafe owners who need to manage a team of staff, F\u0026B vendors \u0026 a dog maintainence team.","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"jannaleong"},"content":"* Prefer typing over other types and is comfortable using CLI applications.","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"jannaleong"},"content":"**Value proposition**: PoochPlanner is a desktop application to track details of various groups (vendors, staff, dog maintainence) that dog cafe owners have to regularly interact with. ","lastModifiedDate":"2024-03-06"},{"lineNumber":269,"author":{"gitId":"jannaleong"},"content":"The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friendly Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"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":"jannaleong"},"content":"| Priority | \u003cdiv style\u003d\"width:50px\"\u003eAs a …​\u003c/div\u003e | I want to …​ | So that I can…​ |","lastModifiedDate":"2024-03-06"},{"lineNumber":277,"author":{"gitId":"jannaleong"},"content":"|---------------|---------------------------------------|------------------------------------------------------------|-------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":278,"author":{"gitId":"jannaleong"},"content":"| `* * *` | well connected user | search contacts | save time |","lastModifiedDate":"2024-03-06"},{"lineNumber":279,"author":{"gitId":"jannaleong"},"content":"| `* * *` | well connected user | add contacts | have the address to contact others in the future |","lastModifiedDate":"2024-03-06"},{"lineNumber":280,"author":{"gitId":"jannaleong"},"content":"| `* * *` | cafe owner user | delete the contacts of people | keep my contacts updated and remove outdated contacts |","lastModifiedDate":"2024-03-06"},{"lineNumber":281,"author":{"gitId":"jannaleong"},"content":"| `* * *` | long-term user | edit contacts | update some contact information |","lastModifiedDate":"2024-03-06"},{"lineNumber":282,"author":{"gitId":"jannaleong"},"content":"| `* * *` | first-time user | get help about what commnads I can use on the contact book | easily know how to navigate the system |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"jannaleong"},"content":"| `**` | frugal user | sort my vendors in ascending order of price | view the vendors selling the cheapest products easily |","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC01 - Add Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a new contact is added into list`","lastModifiedDate":"2024-03-01"},{"lineNumber":299,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":300,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"yleeyilin"},"content":"1. User requests to add contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms success update.","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":309,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the required field.","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects a duplicate name entry.","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters the correct command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until there is no duplicate entry in input.","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":324,"author":{"gitId":"chiageng"},"content":"* 1c. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":325,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":326,"author":{"gitId":"chiageng"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":327,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":328,"author":{"gitId":"chiageng"},"content":" * Steps 1c1 - 1c2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":329,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":330,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":331,"author":{"gitId":"chiageng"},"content":"* 1d. PoochPlanner detect unknown input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":332,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":333,"author":{"gitId":"chiageng"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":334,"author":{"gitId":"chiageng"},"content":" * 1d2. User re-enters the correct input for employment.","lastModifiedDate":"2024-03-02"},{"lineNumber":335,"author":{"gitId":"chiageng"},"content":" * Steps 1d1 - 1d2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":336,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":338,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC02 - Delete Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":342,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":343,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is deleted from list`","lastModifiedDate":"2024-03-01"},{"lineNumber":346,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":347,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"yleeyilin"},"content":"1. User requests to delete contact of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":350,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner removes person and updates list of persons.","lastModifiedDate":"2024-02-29"},{"lineNumber":351,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful deletion.","lastModifiedDate":"2024-02-29"},{"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":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":356,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":357,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":358,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":359,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":360,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":361,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":362,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":363,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":364,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":365,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":366,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":367,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":368,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":369,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":370,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":371,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":372,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":373,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":374,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC03 - Edit Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":375,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":376,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":377,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":378,"author":{"gitId":"chiageng"},"content":"**Guarantee**: `If MSS reach step 3, a contact is edited successfully in the list`","lastModifiedDate":"2024-03-01"},{"lineNumber":379,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":380,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":381,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":382,"author":{"gitId":"yleeyilin"},"content":"1. User requests to edit the field of a person.","lastModifiedDate":"2024-02-29"},{"lineNumber":383,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner updates the field of specified person.","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner confirms successful edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":385,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":388,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing name field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with the name field.","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until the input entered are correct.","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":397,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner is unable to find the Person.","lastModifiedDate":"2024-02-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":399,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":400,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with another name.","lastModifiedDate":"2024-02-29"},{"lineNumber":401,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":402,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":404,"author":{"gitId":"yleeyilin"},"content":"* 1c. User requests to edit the name field to a name that already exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":405,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":406,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":407,"author":{"gitId":"chiageng"},"content":" * 1c2. User re-enters the command with a different name.","lastModifiedDate":"2024-03-02"},{"lineNumber":408,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until the new name field is valid.","lastModifiedDate":"2024-02-29"},{"lineNumber":409,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":410,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":411,"author":{"gitId":"yleeyilin"},"content":"* 1d. User did not specify the field that they want to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":412,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":413,"author":{"gitId":"yleeyilin"},"content":" * 1d1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":414,"author":{"gitId":"yleeyilin"},"content":" * 1d2. User re-enters the command and specify the field/s to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":415,"author":{"gitId":"yleeyilin"},"content":" * Steps 1d1 - 1d2 are repeated until there exist a specified field to edit.","lastModifiedDate":"2024-02-29"},{"lineNumber":416,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":417,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":418,"author":{"gitId":"yleeyilin"},"content":"* 1e. User specified an invalid field.","lastModifiedDate":"2024-02-29"},{"lineNumber":419,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":420,"author":{"gitId":"yleeyilin"},"content":" * 1e1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":421,"author":{"gitId":"yleeyilin"},"content":" * 1e2. User re-enters the command and edits a different field.","lastModifiedDate":"2024-02-29"},{"lineNumber":422,"author":{"gitId":"yleeyilin"},"content":" * Steps 1e1 - 1e2 are repeated until there exist a valid field in the input.","lastModifiedDate":"2024-02-29"},{"lineNumber":423,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":424,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":425,"author":{"gitId":"chiageng"},"content":"* 1f. PoochPlanner detects wrong format for email.","lastModifiedDate":"2024-03-01"},{"lineNumber":426,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":427,"author":{"gitId":"chiageng"},"content":" * 1f1. PoochPlanner displays the error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":428,"author":{"gitId":"chiageng"},"content":" * 1f2. User re-enters the correct email format.","lastModifiedDate":"2024-03-02"},{"lineNumber":429,"author":{"gitId":"chiageng"},"content":" * Steps 1f1 - 1f2 are repeated until there is no error in input.","lastModifiedDate":"2024-03-02"},{"lineNumber":430,"author":{"gitId":"chiageng"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-03-01"},{"lineNumber":431,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":432,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":433,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":434,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":435,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC04 - Search Contact of a Person`","lastModifiedDate":"2024-02-29"},{"lineNumber":436,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":437,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":438,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":439,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":440,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":441,"author":{"gitId":"yleeyilin"},"content":"1. User requests to search for the contact of a person with a keyword for a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":442,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner confirms successful search.","lastModifiedDate":"2024-02-29"},{"lineNumber":443,"author":{"gitId":"yleeyilin"},"content":"3. PoochPlanner returns the sublist of contacts that contains the keyword specified by the user.","lastModifiedDate":"2024-02-29"},{"lineNumber":444,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":445,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"yleeyilin"},"content":"* 1a. PoochPlanner detects a missing field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":452,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the correct command with a specified field.","lastModifiedDate":"2024-02-29"},{"lineNumber":453,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":454,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":455,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":456,"author":{"gitId":"yleeyilin"},"content":"* 1b. PoochPlanner detects multiple fields in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":457,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":458,"author":{"gitId":"yleeyilin"},"content":" * 1b1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":459,"author":{"gitId":"yleeyilin"},"content":" * 1b2. User re-enters a new command with only one field.","lastModifiedDate":"2024-02-29"},{"lineNumber":460,"author":{"gitId":"yleeyilin"},"content":" * Steps 1b1 - 1b2 are repeated until the input references a Person that exists in PoochPlanner.","lastModifiedDate":"2024-02-29"},{"lineNumber":461,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":462,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":463,"author":{"gitId":"yleeyilin"},"content":"* 1c. PoochPlanner detects invalid field in the entered input.","lastModifiedDate":"2024-02-29"},{"lineNumber":464,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":465,"author":{"gitId":"yleeyilin"},"content":" * 1c1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":466,"author":{"gitId":"yleeyilin"},"content":" * 1c2. User re-enters a new command with another field.","lastModifiedDate":"2024-02-29"},{"lineNumber":467,"author":{"gitId":"yleeyilin"},"content":" * Steps 1c1 - 1c2 are repeated until a valid field is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":468,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":469,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":470,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":471,"author":{"gitId":"yleeyilin"},"content":"**System**: `PoochPlanner`","lastModifiedDate":"2024-02-29"},{"lineNumber":472,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":473,"author":{"gitId":"yleeyilin"},"content":"**Use case**: `UC05 - Help Tutorial`","lastModifiedDate":"2024-02-29"},{"lineNumber":474,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":475,"author":{"gitId":"yleeyilin"},"content":"**Actor**: `User`","lastModifiedDate":"2024-02-29"},{"lineNumber":476,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":477,"author":{"gitId":"yleeyilin"},"content":"**MSS**:","lastModifiedDate":"2024-02-29"},{"lineNumber":478,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":479,"author":{"gitId":"yleeyilin"},"content":"1. User requests to learn more about the commands.","lastModifiedDate":"2024-02-29"},{"lineNumber":480,"author":{"gitId":"yleeyilin"},"content":"2. PoochPlanner displays a tutorial information.","lastModifiedDate":"2024-02-29"},{"lineNumber":481,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":482,"author":{"gitId":"yleeyilin"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":483,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":484,"author":{"gitId":"yleeyilin"},"content":"**Extensions**:","lastModifiedDate":"2024-02-29"},{"lineNumber":485,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":486,"author":{"gitId":"yleeyilin"},"content":"* 1a. User requests to learn about an invalid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":487,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":488,"author":{"gitId":"yleeyilin"},"content":" * 1a1. PoochPlanner displays the error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":489,"author":{"gitId":"yleeyilin"},"content":" * 1a2. User re-enters the command and request to learn about a valid command.","lastModifiedDate":"2024-02-29"},{"lineNumber":490,"author":{"gitId":"yleeyilin"},"content":" * Steps 1a1 - 1a2 are repeated until a valid command is inputted by the User.","lastModifiedDate":"2024-02-29"},{"lineNumber":491,"author":{"gitId":"yleeyilin"},"content":" * Use case resumes from step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":492,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":493,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":494,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"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":499,"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":500,"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":501,"author":{"gitId":"chiageng"},"content":"4. All code snippets presented in the developer guides shall follow a consistent coding style and formatting, adhering to the company\u0027s coding standards and best practices.","lastModifiedDate":"2024-03-01"},{"lineNumber":502,"author":{"gitId":"chiageng"},"content":"5. The developer guides shall undergo regular content audits, with outdated or deprecated information flagged for removal or revision, and new features or updates documented within one week of release.","lastModifiedDate":"2024-03-01"},{"lineNumber":503,"author":{"gitId":"chiageng"},"content":"6. The system should respond within 2 seconds.","lastModifiedDate":"2024-03-01"},{"lineNumber":504,"author":{"gitId":"chiageng"},"content":"7. The data should store locally and not accessible from other device for privacy issue.","lastModifiedDate":"2024-03-01"},{"lineNumber":505,"author":{"gitId":"chiageng"},"content":"8. The project is expected to adhere to schedule closely to deliver new feature.","lastModifiedDate":"2024-03-01"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"jamessinmaojun"},"content":"* **PoochPlanner**: An address book CLI software that stores contacts.","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Contact**: A contact that is stored in PoochPlanner.","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Owner**: The target user of PoochPlanner; Dog Cafe owners.","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Client**: Patrons of the Dog Cafe.","lastModifiedDate":"2024-03-06"},{"lineNumber":515,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Supplier**: External suppliers that sell the logistics required for the sustenance of Dog Cafe operations, for example Pooch Food, to the Pooch Cafe Owners at a fixed price.","lastModifiedDate":"2024-03-06"},{"lineNumber":516,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Staff**: Employees of the Dog Cafe that handle the running of the cafe.","lastModifiedDate":"2024-03-06"},{"lineNumber":517,"author":{"gitId":"jamessinmaojun"},"content":"* **Pooch Maintenance Staff**: Specialised external workers that take special care and maintenance of dogs.","lastModifiedDate":"2024-03-06"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"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":526,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"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":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"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":541,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"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":555,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"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":558,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"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":560,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":569,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":570,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"chiageng":37,"jamessinmaojun":7,"jannaleong":13,"-":361,"yleeyilin":152}},{"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":"-"},"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":"chiageng"},"content":" * `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time` : Adds a staff contact named `Poochie` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":32,"author":{"gitId":"chiageng"},"content":" * `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag` : Adds a supplier contact named `PetCo` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":34,"author":{"gitId":"chiageng"},"content":" * `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr` : Adds a helper contact named `Tom Tan` to the Pooch Planner.","lastModifiedDate":"2024-03-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"chiageng"},"content":"* Words in `[parameter name]` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":53,"author":{"gitId":"chiageng"},"content":" e.g. in `/pooch-staff ; name : [name]`, `[name]` is a parameter which can be used as `/pooch-staff ; name : Poochie`.","lastModifiedDate":"2024-03-01"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"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":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"chiageng"},"content":" e.g. if the command specifies `name : [name] ; phone : [phone]`, `phone : [phone] ; name : [name]` is also acceptable.","lastModifiedDate":"2024-03-01"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"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":62,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"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":65,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"jannaleong"},"content":"Shows a message of how to write commands for all commands or a specfic command.","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"jannaleong"},"content":"### Get help for all commands","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"jannaleong"},"content":"### Get help for a specific command","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"jannaleong"},"content":"Format: `help ; command : [command type]`","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"jannaleong"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-staff`","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-supplier`","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : pooch-maintenance`","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : edit`","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"jannaleong"},"content":"* `/help ; command : search`","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"chiageng"},"content":"### Adding a contact: `Add`","lastModifiedDate":"2024-03-01"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"chiageng"},"content":"Adds a staff / supplier / helper to the address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"chiageng"},"content":"#### Adds a staff","lastModifiedDate":"2024-03-01"},{"lineNumber":91,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-staff ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; salary : [salary] ; employment : [part/full] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"chiageng"},"content":"#### Adds a supplier","lastModifiedDate":"2024-03-01"},{"lineNumber":94,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-supplier ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; product : [product] ; price : [price] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":96,"author":{"gitId":"chiageng"},"content":"#### Adds a helper","lastModifiedDate":"2024-03-01"},{"lineNumber":97,"author":{"gitId":"chiageng"},"content":"Format: `/pooch-maintenance ; name : [name] ; phone : [phone] ; address : [address] ; email : [email] ; skill : [skill] ; commission : [commission] ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"chiageng"},"content":"* `/pooch-staff ; name : Poochie ; phone : 98765435 ; address : Poochie Street 21 ; email : ilovecatstoo@gmail.com ; salary : $50/h ; employment : part-time ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":101,"author":{"gitId":"chiageng"},"content":"* `/pooch-supplier ; name : PetCo ; phone : 98673098 ; address : Meow Street 24 ; email : ilovewombatstoo@gmail.com ; product : kibble ; price : $98/bag ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":102,"author":{"gitId":"chiageng"},"content":"* `/pooch-maintenance ; name : Tom Tan ; phone : 98765435 ; address : Poochie Street 24 ; email : ihelppooches@gmail.com ; skill : trainer ; commission : $60/hr ;`","lastModifiedDate":"2024-03-01"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":104,"author":{"gitId":"jannaleong"},"content":"Constraints :","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"chiageng"},"content":"* `Duplicate name will not be allowed`","lastModifiedDate":"2024-03-01"},{"lineNumber":106,"author":{"gitId":"chiageng"},"content":"* `For instance, to check whether a name is unique (case-insensitive), we parse in the .lower() String method to convert all fields to lowercase.`","lastModifiedDate":"2024-03-01"},{"lineNumber":107,"author":{"gitId":"chiageng"},"content":"* `Name field is case-insensitive but space-sensitive`","lastModifiedDate":"2024-03-01"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"yleeyilin"},"content":"### Editing a person : `Edit`","lastModifiedDate":"2024-02-28"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"yleeyilin"},"content":"Edit the fields of the specified person in the address book.","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"yleeyilin"},"content":"Format: `/edit ; name : [NAME] ; field { [FIELD] : [VALUE] }`","lastModifiedDate":"2024-02-28"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":115,"author":{"gitId":"yleeyilin"},"content":"* Edits the specified `field`(s) of the person with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":116,"author":{"gitId":"yleeyilin"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-28"},{"lineNumber":117,"author":{"gitId":"yleeyilin"},"content":"* At least one field must be provided.","lastModifiedDate":"2024-02-28"},{"lineNumber":118,"author":{"gitId":"yleeyilin"},"content":"* More than one field can be updated at the same time.","lastModifiedDate":"2024-02-28"},{"lineNumber":119,"author":{"gitId":"yleeyilin"},"content":"* The field(s) to be edited must be a valid field within their contact type, i.e. Pooch Staff, Pooch Supplier, Pooch Maintenance).","lastModifiedDate":"2024-02-28"},{"lineNumber":120,"author":{"gitId":"yleeyilin"},"content":"* **_Caution_** : Editing `name` field to another name that already exists in Pooch Contact Book is strictly **not** allowed.","lastModifiedDate":"2024-02-28"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-02-28"},{"lineNumber":123,"author":{"gitId":"yleeyilin"},"content":"* `edit ; name : Poochie ; field : { name : Mochie }`","lastModifiedDate":"2024-02-28"},{"lineNumber":124,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":125,"author":{"gitId":"yleeyilin"},"content":" The above command edits the name of the person, from **_Poochie_** to **_Mochie_**, given that there are no other persons with the name, **_Mochie_**, in the Pooch Contact Book.","lastModifiedDate":"2024-02-28"},{"lineNumber":126,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":127,"author":{"gitId":"yleeyilin"},"content":"* `edit ; name : Thomas ; field : { address : Poochie Street 25 ; employment : full-time }`","lastModifiedDate":"2024-02-28"},{"lineNumber":128,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":129,"author":{"gitId":"yleeyilin"},"content":" The above command edits the address of **_Thomas_** to **_Poochie Street 25_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":130,"author":{"gitId":"yleeyilin"},"content":" The above command also edits the employment of **_Thomas_**, which **must** be a **_Pooch Staff_**, to **_full-time_**.","lastModifiedDate":"2024-02-28"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"jamessinmaojun"},"content":"Format: `/delete ; name : [NAME]`","lastModifiedDate":"2024-02-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"jamessinmaojun"},"content":"* Deletes the contact with the specified `name`. Note that the specified person must first exist in Pooch Contact Book.","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"jamessinmaojun"},"content":"* The name is a compulsory field that is case-insensitive but space-sensitive.","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"jamessinmaojun"},"content":"* `delete ; name : Poochie`","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Poochie_**, provided **_Poochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"jamessinmaojun"},"content":" ","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"jamessinmaojun"},"content":"* `delete ; name : Moochie`","lastModifiedDate":"2024-02-29"},{"lineNumber":165,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":166,"author":{"gitId":"jamessinmaojun"},"content":" The above command deletes the contact with name **_Moochie_**, provided **_Moochie_** exists as a name of a contact in Pooch Contact Book","lastModifiedDate":"2024-02-29"},{"lineNumber":167,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"Joshy837"},"content":"### Searching a contact : `search`","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"Joshy837"},"content":"Searches through the address book using specified fields and keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"Joshy837"},"content":"Formats:","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"Joshy837"},"content":"/search ; name : [full/partial name]","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"Joshy837"},"content":"/search ; phone : [full/partial phone]","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"Joshy837"},"content":"/search ; address : [full/partial address]","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"Joshy837"},"content":"/search ; email : [full/partial email]","lastModifiedDate":"2024-03-06"},{"lineNumber":179,"author":{"gitId":"Joshy837"},"content":"/search ; product : [full/partial product name]","lastModifiedDate":"2024-03-06"},{"lineNumber":180,"author":{"gitId":"Joshy837"},"content":"/search ; employment : [employment]","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":182,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"Joshy837"},"content":"* Searches the person by specifying field (i.e. `name`, `phone`, `address`, etc.), followed by the partial or full keyword","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"Joshy837"},"content":"* Current feature does not allow users to search for `commission`, `salary`, and `price`","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"Joshy837"},"content":"* All fields are **case-insensitive**.","lastModifiedDate":"2024-03-06"},{"lineNumber":186,"author":{"gitId":"Joshy837"},"content":"For instance, to check whether a name is unique (case-insensitive)","lastModifiedDate":"2024-03-06"},{"lineNumber":187,"author":{"gitId":"Joshy837"},"content":" * Eg : `Janna` and `janna` are both equivalent","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"Joshy837"},"content":"* Spaces within each input are considered","lastModifiedDate":"2024-03-06"},{"lineNumber":189,"author":{"gitId":"Joshy837"},"content":" * Eg: `Tom Tan Er` is different from `Tom Taner`","lastModifiedDate":"2024-03-06"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":194,"author":{"gitId":"Joshy837"},"content":"/search ; name : Poochie","lastModifiedDate":"2024-03-06"},{"lineNumber":195,"author":{"gitId":"Joshy837"},"content":"/search ; phone : 98765432","lastModifiedDate":"2024-03-06"},{"lineNumber":196,"author":{"gitId":"Joshy837"},"content":"/search ; address : Poochie Street 21","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"Joshy837"},"content":"/search ; email : ilovecatstoo@gmail.com","lastModifiedDate":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"Joshy837"},"content":"/search ; address : Pooch","lastModifiedDate":"2024-03-06"},{"lineNumber":199,"author":{"gitId":"Joshy837"},"content":"/search ; description : Food","lastModifiedDate":"2024-03-06"},{"lineNumber":200,"author":{"gitId":"Joshy837"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":202,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"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":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":220,"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":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":223,"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":224,"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":225,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":227,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"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":237,"author":{"gitId":"-"},"content":"","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":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":242,"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":243,"author":{"gitId":"-"},"content":"","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":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"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":251,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"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":254,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Joshy837":29,"chiageng":22,"jamessinmaojun":11,"jannaleong":12,"-":165,"yleeyilin":17}},{"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":"jamessinmaojun"},"content":" content: \"PoochPlanner\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"jamessinmaojun":1,"-":294}},{"path":"docs/team/chiageng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"chiageng"},"content":"layout: page","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"chiageng"},"content":"title: Chia Geng\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"chiageng"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"chiageng"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"chiageng"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-01"},{"lineNumber":9,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":10,"author":{"gitId":"chiageng"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"},{"lineNumber":11,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":12,"author":{"gitId":"chiageng"},"content":"* **New Feature**: Added the ability to add contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"chiageng"},"content":" * What it does: allows the user to add a new contact.","lastModifiedDate":"2024-03-01"},{"lineNumber":14,"author":{"gitId":"chiageng"},"content":" * Justification: This feature improves the product significantly because a user can store all contacts in this address book.","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"chiageng"},"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-01"},{"lineNumber":16,"author":{"gitId":"chiageng"},"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-01"},{"lineNumber":17,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"chiageng"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"chiageng"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":20,"author":{"gitId":"chiageng"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"chiageng"},"content":" * User Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":22,"author":{"gitId":"chiageng"},"content":" * Added documentation for the features `add` [\\#72]()","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"chiageng"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-01"},{"lineNumber":24,"author":{"gitId":"chiageng"},"content":" * Added non functional requirements.","lastModifiedDate":"2024-03-01"},{"lineNumber":25,"author":{"gitId":"chiageng"},"content":" * Updated use cases for PoochPlanner.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"chiageng":25}},{"path":"docs/team/jamessinmaojun.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"jamessinmaojun"},"content":"layout: page","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"jamessinmaojun"},"content":"title: James\u0027 Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"jamessinmaojun"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"jamessinmaojun"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"jamessinmaojun"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"jamessinmaojun"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"jamessinmaojun"},"content":"* **New Feature**: Added the ability to delete contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"jamessinmaojun"},"content":" * What it does: allows the user to delete a certain contact, one at a time.","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"jamessinmaojun"},"content":" * Justification: This feature improves the product significantly because the address book can become too long and cluttered over time. Given the nature of the target users\u0027 business, contact turnover rate is expected to be very high and thus deleting unused contacts proves to be useful.","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"jamessinmaojun"},"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-29"},{"lineNumber":16,"author":{"gitId":"jamessinmaojun"},"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":17,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"jamessinmaojun"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"jamessinmaojun"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"jamessinmaojun"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":21,"author":{"gitId":"jamessinmaojun"},"content":" * User Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"jamessinmaojun"},"content":" * Added documentation for the feature `delete` [\\#29]()","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"jamessinmaojun"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"jamessinmaojun"},"content":" * Added use cases for PoochPlanner [\\#30]()","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"jamessinmaojun":24}},{"path":"docs/team/jannaleong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jannaleong"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jannaleong"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jannaleong"},"content":"title: Janna\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jannaleong"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jannaleong"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jannaleong"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jannaleong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jannaleong"},"content":"* **New Feature**: Added the ability to give help to users regarding commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jannaleong"},"content":" * What it does: Returns the user the correct command format for specific commands or all commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jannaleong"},"content":" * Justification: This feature is crucial for first time users who are unfamiliar to the commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jannaleong"},"content":" * Highlights: This enhancement is affected by existing commands and must be updated to accomodate to new commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jannaleong"},"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":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jannaleong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jannaleong"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jannaleong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jannaleong"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jannaleong"},"content":" * Added documentation for the feature `help` [\\#17]())","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jannaleong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jannaleong"},"content":" * Added target user profile, value proposition, and user stories [\\#19]())","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jannaleong":24}},{"path":"docs/team/joshuayip.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Joshy837"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"Joshy837"},"content":"layout: page","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"Joshy837"},"content":"title: Joshua Yip\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"Joshy837"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"Joshy837"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"Joshy837"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"Joshy837"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"Joshy837"},"content":"* **New Feature**: Added the ability to search contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"Joshy837"},"content":" * What it does: allows the user to search a contact within a field using a specified keyword.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"Joshy837"},"content":" * Justification: This feature improves the product significantly because a user can search contacts in this address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"Joshy837"},"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":"Joshy837"},"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":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"Joshy837"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"Joshy837"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"Joshy837"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"Joshy837"},"content":" * README:","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"Joshy837"},"content":" * Updated README for PoochPlanner [\\#15]()","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"Joshy837"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"Joshy837"},"content":" * Added documentation for the features `search` [\\#25]()","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"Joshy837":24}},{"path":"docs/team/yleeyilin.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"yleeyilin"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"yleeyilin"},"content":"title: Yi Lin\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"yleeyilin"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"yleeyilin"},"content":"### Project: PoochPlanner","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"yleeyilin"},"content":"PoochPlanner is a desktop application to track details of various groups (vendors, staff) that dog cafe owners have to regularly interact with. The app is optimised for use using Command Line Interface (CLI) while still encompassing a user-friend Graphical User Interface (GUI).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"yleeyilin"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"yleeyilin"},"content":"* **New Feature**: Added the ability to edit previous contacts.","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"yleeyilin"},"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":"yleeyilin"},"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":"yleeyilin"},"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":"yleeyilin"},"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":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"yleeyilin"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"yleeyilin"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"yleeyilin"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"yleeyilin"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"yleeyilin"},"content":" * Added documentation for the feature `edit` [\\#29]())","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"yleeyilin"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"yleeyilin"},"content":" * Added use cases for PoochPlanner [\\#30]())","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"yleeyilin":24}}] diff --git a/AY2324S2-CS2103T-W10-2_tp_master/commits.json b/AY2324S2-CS2103T-W10-2_tp_master/commits.json index 19f853ee..fb747e37 100644 --- a/AY2324S2-CS2103T-W10-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Joshy837":[{"date":"2024-02-28","commitResults":[{"hash":"83bd77e2c927eb71330a172350bbeb2c4354c520","isMergeCommit":true,"messageTitle":"Merge pull request #27 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update user guide for edit command","fileTypesAndContributionMap":{}}]}],"chiageng":[{"date":"2024-03-01","commitResults":[{"hash":"c9d32a2812847939a6e3b9481807385d0f8d68eb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"481d16a1dd2443288f46f447b8aa6faefa88fb98","isMergeCommit":false,"messageTitle":"Update AboutUs.md and chiageng.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":4}}},{"hash":"f012713ded2d80524e6fb8ca2dde135d0895b610","isMergeCommit":false,"messageTitle":"Add User Guide for feature add","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":22}}},{"hash":"054e6a41a3956961f5c0b130393882a8d82dca49","isMergeCommit":false,"messageTitle":"Update developer guide on non functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"3fec7d1e12a7d3d08cd37930b3c84aa878341e39","isMergeCommit":false,"messageTitle":"Update use cases in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":64,"deletions":0}}},{"hash":"e26c4db963811a434ee64222507e81f687482493","isMergeCommit":false,"messageTitle":"Update non functional requirements in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":0}}}]},{"date":"2024-03-02","commitResults":[{"hash":"129f406a219d9e0791d8bcd8ca766ad47e9b5f63","isMergeCommit":false,"messageTitle":"Update Developer Guide and fix minor mistakes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":43}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ecf1b6d1a3403397e593d7219076b28ccaedf131","isMergeCommit":true,"messageTitle":"Merge pull request #34 from chiageng/branch-v1.1","messageBody":"Update AboutUs, User Guides and Developer Guide","fileTypesAndContributionMap":{}},{"hash":"0f9973b861864de5be8f23dcf578bcea5fbdb333","isMergeCommit":true,"messageTitle":"Merge pull request #31 from jamessinmaojun/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"jamessinmaojun":[{"date":"2024-02-29","commitResults":[{"hash":"6f9b1109117a980007ea1ba7c145cec05687552a","isMergeCommit":false,"messageTitle":"Update James Sin\u0027s Info for AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"9f4c7d68911725985805a89390dce4355343ebf1","isMergeCommit":false,"messageTitle":"Create jamessinmaojun.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":0}}},{"hash":"84698158b446bc92404f95a2e64db344994d4bcc","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":23}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a28da82aec82722a8d9a35860b6d0d75a3f03a69","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Add glossary","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"jannaleong":[],"yleeyilin":[{"date":"2024-02-28","commitResults":[{"hash":"513e1e7f53d2d120abc6b8f507957691d1252b14","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"62061f70307ee501af14d5cad43bff53a70315f4","isMergeCommit":false,"messageTitle":"Update user guide for edit command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":3}}},{"hash":"9271fdd4fbcb869cf5fc222e4f08bd880151599b","isMergeCommit":false,"messageTitle":"Fix extra line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"c2c9ba82b2aa6ae5ae7f56563099b5d568ef5934","isMergeCommit":false,"messageTitle":"Specify new constraint","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3d2abf6a8c3a7d2bc96d90904dd454ffa16f4e5c","isMergeCommit":false,"messageTitle":"Revert \"Update user guide for edit command\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":20}}},{"hash":"90aad7645a196caa6627e5c65b9582d7c59edcdb","isMergeCommit":true,"messageTitle":"Merge pull request #28 from AY2324S2-CS2103T-W10-2/revert-27-Update-UG-Edit-Command","messageBody":"Revert \"Update user guide for edit command\"","fileTypesAndContributionMap":{}},{"hash":"613dad4320429e6a970575653be02cfd7bee3ca2","isMergeCommit":false,"messageTitle":"Add descriptions","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"facd6d8cf4568105184d87df193a807bafa281d0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-UG-Edit-Command","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9759588f35a06c091ebf956d9a90c5a51276286e","isMergeCommit":true,"messageTitle":"Merge pull request #29 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update User Guide for Edit Command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"774d831795c694fc1b1fe5630347f8311fb97403","isMergeCommit":false,"messageTitle":"Update use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":197,"deletions":13}}},{"hash":"d9b8bf2c9e7f6a89317de3eeed40591aa78e2ce8","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"d67b158b565918ca1282632eadd6e13facefeacc","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":25}}},{"hash":"ea6d5c8730c5b5b1482f61c49b48b782c65cb83c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}},{"hash":"df138564ce343ade0bebd670d6c608e81048ab00","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":15}}},{"hash":"d1a38ffa8215cfd04f6aa62743f719f4fc197bf9","isMergeCommit":true,"messageTitle":"Merge pull request #26 from yleeyilin/Update-AboutUs-YiLin","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"fe5b4a72e017bdc44d58082f64f464a28129c6f0","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":42}}},{"hash":"5767e13c04cb8c8257a26e6698f85192624d0f80","isMergeCommit":true,"messageTitle":"Merge pull request #30 from yleeyilin/Update-DG-Use-Cases","messageBody":"Update use case for DG","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Joshy837":{"docs":0,"functional-code":0,"test-code":0},"chiageng":{"docs":90,"functional-code":0,"test-code":0},"jamessinmaojun":{"docs":43,"functional-code":0,"test-code":0,"other":1},"jannaleong":{"docs":0,"functional-code":0,"test-code":0},"yleeyilin":{"docs":198,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Joshy837":0.0,"chiageng":1819.8229,"jamessinmaojun":345.75146,"jannaleong":0.0,"yleeyilin":7781.7534},"authorDisplayNameMap":{"Joshy837":"CS2103T-W10-2 JOSH..UJUN","chiageng":"CS2103T-W10-2 CHNG..GENG","jamessinmaojun":"CS2103T-W10-2 JAME.. JUN","jannaleong":"CS2103T-W10-2 LEON..ANNA","yleeyilin":"CS2103T-W10-2 LEE .. LIN"}} +{"authorDailyContributionsMap":{"Joshy837":[{"date":"2024-02-28","commitResults":[{"hash":"83bd77e2c927eb71330a172350bbeb2c4354c520","isMergeCommit":true,"messageTitle":"Merge pull request #27 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update user guide for edit command","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"9362d7c59af2aef8085369da97a6270abd3c3de9","isMergeCommit":false,"messageTitle":"Update AboutUs for Joshua","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"45608234968e00d33d132bb89c73e7ecf3745051","isMergeCommit":false,"messageTitle":"Update the UG (Search command)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":0}}},{"hash":"a90cca88103979eb145814e1639f626c0e8935f6","isMergeCommit":false,"messageTitle":"Update Joshua\u0027s Portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":0}}},{"hash":"9dd49354fbfe26b3477ba26b2a60e2a25fa3ad0b","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":1}}}]}],"chiageng":[{"date":"2024-03-01","commitResults":[{"hash":"c9d32a2812847939a6e3b9481807385d0f8d68eb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"481d16a1dd2443288f46f447b8aa6faefa88fb98","isMergeCommit":false,"messageTitle":"Update AboutUs.md and chiageng.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":4}}},{"hash":"f012713ded2d80524e6fb8ca2dde135d0895b610","isMergeCommit":false,"messageTitle":"Add User Guide for feature add","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":22}}},{"hash":"054e6a41a3956961f5c0b130393882a8d82dca49","isMergeCommit":false,"messageTitle":"Update developer guide on non functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}},{"hash":"3fec7d1e12a7d3d08cd37930b3c84aa878341e39","isMergeCommit":false,"messageTitle":"Update use cases in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":64,"deletions":0}}},{"hash":"e26c4db963811a434ee64222507e81f687482493","isMergeCommit":false,"messageTitle":"Update non functional requirements in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":0}}}]},{"date":"2024-03-02","commitResults":[{"hash":"129f406a219d9e0791d8bcd8ca766ad47e9b5f63","isMergeCommit":false,"messageTitle":"Update Developer Guide and fix minor mistakes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":43}}}]},{"date":"2024-03-06","commitResults":[{"hash":"ecf1b6d1a3403397e593d7219076b28ccaedf131","isMergeCommit":true,"messageTitle":"Merge pull request #34 from chiageng/branch-v1.1","messageBody":"Update AboutUs, User Guides and Developer Guide","fileTypesAndContributionMap":{}},{"hash":"0f9973b861864de5be8f23dcf578bcea5fbdb333","isMergeCommit":true,"messageTitle":"Merge pull request #31 from jamessinmaojun/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"c900b20f07834410568ca87b2df944e1c81638f9","isMergeCommit":true,"messageTitle":"Merge pull request #36 from Joshy837/master","messageBody":"Fix Joshua\u0027s Issues for V1.1","fileTypesAndContributionMap":{}},{"hash":"19b9f76fda0a5524aa5a1de6d89eba2c97ff06f0","isMergeCommit":true,"messageTitle":"Merge pull request #37 from jamessinmaojun/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"0a95734a867cd7a8aa4283da71b8b6f540383772","isMergeCommit":true,"messageTitle":"Merge pull request #35 from jannaleong/UpdateAboutUs_UG_DG","messageBody":"Update about us ug dg","fileTypesAndContributionMap":{}},{"hash":"90567398bf81518b3c54e6064273d40b94bb747f","isMergeCommit":true,"messageTitle":"Merge pull request #38 from jannaleong/UpdateAboutUs_UG_DG","messageBody":"Fix formatting issues in dg","fileTypesAndContributionMap":{}}]}],"jamessinmaojun":[{"date":"2024-02-29","commitResults":[{"hash":"6f9b1109117a980007ea1ba7c145cec05687552a","isMergeCommit":false,"messageTitle":"Update James Sin\u0027s Info for AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"9f4c7d68911725985805a89390dce4355343ebf1","isMergeCommit":false,"messageTitle":"Create jamessinmaojun.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":0}}},{"hash":"84698158b446bc92404f95a2e64db344994d4bcc","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":23}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a28da82aec82722a8d9a35860b6d0d75a3f03a69","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Add glossary","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"0e256e6aa8c10564eaff21f4ec7a30c42a75d27d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Update glossary","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":1}}}]}],"jannaleong":[{"date":"2024-03-06","commitResults":[{"hash":"8d5b72795bc362fc0c4232fee81f32be64eb856b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp","messageBody":"* \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-2/tp:\n Update Developer Guide and fix minor mistakes\n Update non functional requirements in developer guide\n Update use cases in developer guide\n Update developer guide on non functional requirements\n Add User Guide for feature add\n Update AboutUs.md and chiageng.md\n Update DeveloperGuide.md\n Update DeveloperGuide.md\n Update AboutUs.md\n Update yleeyilin.md\n Update yleeyilin.md\n Update use case for DG\n Add descriptions\n Revert \"Update user guide for edit command\"\n Specify new constraint\n Fix extra line\n Update user guide for edit command\n Update AboutUs.md\n Update index.md\n Update README.md\n","fileTypesAndContributionMap":{}},{"hash":"0772456a20185d3c5e425333d4043748ad09e2c8","isMergeCommit":false,"messageTitle":"Update aboutus, dg and ug","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":23}}},{"hash":"4f1d904a8ea79888560366103327bed8a8787785","isMergeCommit":false,"messageTitle":"Fix ubuntu build failure","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":19}}},{"hash":"e891563423723798ec7b2399e5001b329a4b3810","isMergeCommit":false,"messageTitle":"Fix build ubuntu","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"49bb2d38eb92f24beda35ffd6795faf62caec06f","isMergeCommit":false,"messageTitle":"Fix formatting issues in dg","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]}],"yleeyilin":[{"date":"2024-02-28","commitResults":[{"hash":"513e1e7f53d2d120abc6b8f507957691d1252b14","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"62061f70307ee501af14d5cad43bff53a70315f4","isMergeCommit":false,"messageTitle":"Update user guide for edit command","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":3}}},{"hash":"9271fdd4fbcb869cf5fc222e4f08bd880151599b","isMergeCommit":false,"messageTitle":"Fix extra line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"c2c9ba82b2aa6ae5ae7f56563099b5d568ef5934","isMergeCommit":false,"messageTitle":"Specify new constraint","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3d2abf6a8c3a7d2bc96d90904dd454ffa16f4e5c","isMergeCommit":false,"messageTitle":"Revert \"Update user guide for edit command\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":20}}},{"hash":"90aad7645a196caa6627e5c65b9582d7c59edcdb","isMergeCommit":true,"messageTitle":"Merge pull request #28 from AY2324S2-CS2103T-W10-2/revert-27-Update-UG-Edit-Command","messageBody":"Revert \"Update user guide for edit command\"","fileTypesAndContributionMap":{}},{"hash":"613dad4320429e6a970575653be02cfd7bee3ca2","isMergeCommit":false,"messageTitle":"Add descriptions","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"facd6d8cf4568105184d87df193a807bafa281d0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-UG-Edit-Command","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9759588f35a06c091ebf956d9a90c5a51276286e","isMergeCommit":true,"messageTitle":"Merge pull request #29 from yleeyilin/Update-UG-Edit-Command","messageBody":"Update User Guide for Edit Command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"774d831795c694fc1b1fe5630347f8311fb97403","isMergeCommit":false,"messageTitle":"Update use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":197,"deletions":13}}},{"hash":"d9b8bf2c9e7f6a89317de3eeed40591aa78e2ce8","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"d67b158b565918ca1282632eadd6e13facefeacc","isMergeCommit":false,"messageTitle":"Update yleeyilin.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":25}}},{"hash":"ea6d5c8730c5b5b1482f61c49b48b782c65cb83c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}},{"hash":"df138564ce343ade0bebd670d6c608e81048ab00","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":15}}},{"hash":"d1a38ffa8215cfd04f6aa62743f719f4fc197bf9","isMergeCommit":true,"messageTitle":"Merge pull request #26 from yleeyilin/Update-AboutUs-YiLin","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"fe5b4a72e017bdc44d58082f64f464a28129c6f0","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":42}}},{"hash":"5767e13c04cb8c8257a26e6698f85192624d0f80","isMergeCommit":true,"messageTitle":"Merge pull request #30 from yleeyilin/Update-DG-Use-Cases","messageBody":"Update use case for DG","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Joshy837":{"docs":70,"functional-code":0,"test-code":0},"chiageng":{"docs":89,"functional-code":0,"test-code":0},"jamessinmaojun":{"docs":48,"functional-code":0,"test-code":0,"other":1},"jannaleong":{"docs":54,"functional-code":0,"test-code":0},"yleeyilin":{"docs":199,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Joshy837":443.14795,"chiageng":1819.8229,"jamessinmaojun":347.4082,"jannaleong":1294.0829,"yleeyilin":7781.7534},"authorDisplayNameMap":{"Joshy837":"CS2103T-W10-2 JOSH..UJUN","chiageng":"CS2103T-W10-2 CHNG..GENG","jamessinmaojun":"CS2103T-W10-2 JAME.. JUN","jannaleong":"CS2103T-W10-2 LEON..ANNA","yleeyilin":"CS2103T-W10-2 LEE .. LIN"}} diff --git a/AY2324S2-CS2103T-W10-4_tp_master/authorship.json b/AY2324S2-CS2103T-W10-4_tp_master/authorship.json index 647eba26..be14a3a5 100644 --- a/AY2324S2-CS2103T-W10-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W10-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"doyelee0313"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-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":"doyelee0313"},"content":"# TutorsContactsPro","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"doyelee0313"},"content":"* TutorsContactsPro is a app for computer science tutor managing students for tutorials (all cs course or type of teaching)","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"doyelee0313"},"content":"* TutorsContactsPro allows tutors to have faster and more convenient access to their list of students (from different classes), optimized for those who prefer a clean UI with the use of CLI.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"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":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":"doyelee0313"},"content":"* It is named `TutorsContactsPro` (`TCP` for short) which means it is a pro-version app for tutors to manage their students","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"doyelee0313"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://ay2324s2-cs2103t-w10-4.github.io/tp/index.html)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"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":16,"author":{"gitId":"doyelee0313"},"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":{"doyelee0313":9,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"doyelee0313"},"content":"### Doye Lee","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"doyelee0313"},"content":"\u003cimg src\u003d\"images/doyelee0313.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"doyelee0313"},"content":"[[github](https://github.com/doyelee0313)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"doyelee0313"},"content":"[[portfolio](team/doyelee0313.md)]","lastModifiedDate":"2024-03-05"},{"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":"doyelee0313"},"content":"* Responsibilities: Development + UI + Documentation","lastModifiedDate":"2024-03-05"},{"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":"STELLA-LYE"},"content":"### Stella Lye Si Yu","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"STELLA-LYE"},"content":"\u003cimg src\u003d\"images/STELLA-LYE.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"STELLA-LYE"},"content":"[[homepage](http://STELLA-LYE.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"STELLA-LYE"},"content":"[[github](https://github.com/STELLA-LYE)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"STELLA-LYE"},"content":"[[portfolio](team/STELLA-LYE.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"STELLA-LYE"},"content":"* Responsibilities: Dev Ops + Development + UI","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"tohlh"},"content":"### Toh Li Heng","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"tohlh"},"content":"\u003cimg src\u003d\"images/tohlh.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"tohlh"},"content":"[[homepage](http://tohlh.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"tohlh"},"content":"[[github](http://github.com/tohlh)]","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"tohlh"},"content":"[[portfolio](team/tohlh.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"tohlh"},"content":"* Responsibilities: Dev Ops + Development","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"doyelee0313":5,"STELLA-LYE":6,"-":37,"tohlh":6}},{"path":"docs/team/STELLA-LYE.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"STELLA-LYE"},"content":"layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"STELLA-LYE"},"content":"title: \"Stella\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"STELLA-LYE"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"STELLA-LYE"},"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-04"},{"lineNumber":9,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"STELLA-LYE"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"STELLA-LYE":11}},{"path":"docs/team/doyelee0313.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"doyelee0313"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"doyelee0313"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"doyelee0313"},"content":" title: \"Doye\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"doyelee0313"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"doyelee0313"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"doyelee0313"},"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":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"doyelee0313"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"doyelee0313":11}},{"path":"docs/team/tohlh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"tohlh"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"tohlh"},"content":" title: \"Li Heng\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"tohlh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"tohlh"},"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-04"},{"lineNumber":9,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"tohlh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"tohlh":11}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"doyelee0313"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-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":"doyelee0313"},"content":"# TutorsContactsPro","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"doyelee0313"},"content":"* TutorsContactsPro is a app for computer science tutor managing students for tutorials (all cs course or type of teaching)","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"doyelee0313"},"content":"* TutorsContactsPro allows tutors to have faster and more convenient access to their list of students (from different classes), optimized for those who prefer a clean UI with the use of CLI.","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"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":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":"doyelee0313"},"content":"* It is named `TutorsContactsPro` (`TCP` for short) which means it is a pro-version app for tutors to manage their students","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"doyelee0313"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://ay2324s2-cs2103t-w10-4.github.io/tp/index.html)**.","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"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":16,"author":{"gitId":"doyelee0313"},"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":{"doyelee0313":9,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"doyelee0313"},"content":"### Doye Lee","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"doyelee0313"},"content":"\u003cimg src\u003d\"images/doyelee0313.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"doyelee0313"},"content":"[[github](https://github.com/doyelee0313)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"doyelee0313"},"content":"[[portfolio](team/doyelee0313.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"doyelee0313"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"doyelee0313"},"content":"* Responsibilities: Development + UI + Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"jocelyn-soh"},"content":"### Soh Kia Hwee Jocelyn","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"jocelyn-soh"},"content":"\u003cimg src\u003d\"images/jocelyn-soh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"jocelyn-soh"},"content":"[[github](https://github.com/jocelyn-soh)]","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jocelyn-soh"},"content":"[[portfolio](team/jocelyn-soh.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jocelyn-soh"},"content":"* Responsibilities: Dev Ops + Development + Code Quality","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"STELLA-LYE"},"content":"### Stella Lye Si Yu","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"STELLA-LYE"},"content":"\u003cimg src\u003d\"images/stella_lye.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"STELLA-LYE"},"content":"[[homepage](http://STELLA-LYE.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"STELLA-LYE"},"content":"[[github](https://github.com/STELLA-LYE)]","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"STELLA-LYE"},"content":"[[portfolio](team/stella_lye.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"STELLA-LYE"},"content":"* Responsibilities: Dev Ops + Development + UI","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"tohlh"},"content":"### Toh Li Heng","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"tohlh"},"content":"\u003cimg src\u003d\"images/tohlh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"tohlh"},"content":"[[homepage](http://tohlh.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"tohlh"},"content":"[[github](http://github.com/tohlh)]","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"tohlh"},"content":"[[portfolio](team/tohlh.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"tohlh"},"content":"* Responsibilities: Dev Ops + Development","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"doyelee0313":6,"STELLA-LYE":6,"-":31,"jocelyn-soh":5,"tohlh":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":"jocelyn-soh"},"content":"# TutorsContactsPro Developer Guide","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`Main`** (consisting of classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern desktop applications follow.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"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":334,"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":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":351,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":352,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"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":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"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":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"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":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"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":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"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":386,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":395,"jocelyn-soh":1}},{"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":"jocelyn-soh"},"content":"# TutorsContactsPro User Guide","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"jocelyn-soh"},"content":"TutorsContactsPro is a **desktop app for tutors teaching Computer Science courses to manage their students, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TutorsContactsPro can help you to gain faster and more convenient access to your list of students, even if they are from different classes.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"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":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"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":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"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":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":{"-":202,"jocelyn-soh":2}},{"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":"jocelyn-soh"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTutorsContactsPro\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":{"-":66,"jocelyn-soh":1}},{"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":"jocelyn-soh"},"content":"# TutorsContactsPro","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"jocelyn-soh"},"content":"**TutorsContactsPro is a desktop application for tutors teaching Computer Science courses to manage their students.** 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":"jocelyn-soh"},"content":"* If you are interested in using TutorsContactsPro, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jocelyn-soh"},"content":"* If you are interested about developing TutorsContactsPro, 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":"-"},"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":{"-":17,"jocelyn-soh":4}},{"path":"docs/team/doyelee0313.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"doyelee0313"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"doyelee0313"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"doyelee0313"},"content":" title: \"Doye\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"doyelee0313"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"doyelee0313"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"doyelee0313"},"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":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"doyelee0313"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"doyelee0313":11}},{"path":"docs/team/jocelyn-soh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jocelyn-soh"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jocelyn-soh"},"content":" layout: default.md","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jocelyn-soh"},"content":" title: \"Jocelyn\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jocelyn-soh"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jocelyn-soh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jocelyn-soh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jocelyn-soh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jocelyn-soh"},"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":"jocelyn-soh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jocelyn-soh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jocelyn-soh":10}},{"path":"docs/team/stella_lye.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"STELLA-LYE"},"content":"layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"STELLA-LYE"},"content":"title: \"Stella\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"STELLA-LYE"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"STELLA-LYE"},"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-04"},{"lineNumber":9,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"STELLA-LYE"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"STELLA-LYE":11}},{"path":"docs/team/tohlh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"tohlh"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"tohlh"},"content":" title: \"Li Heng\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"tohlh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"tohlh"},"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-04"},{"lineNumber":9,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"tohlh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"tohlh":11}}] diff --git a/AY2324S2-CS2103T-W10-4_tp_master/commits.json b/AY2324S2-CS2103T-W10-4_tp_master/commits.json index 45491097..ec3db295 100644 --- a/AY2324S2-CS2103T-W10-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"doyelee0313":[{"date":"2024-03-05","commitResults":[{"hash":"21e7fd316d98570476976d8bfa3a73cc647c0439","isMergeCommit":false,"messageTitle":"Update Doye AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":15}}}]},{"date":"2024-03-06","commitResults":[{"hash":"3cd2515a6a52d379fb164e314655685b905a8a78","isMergeCommit":false,"messageTitle":"Updated README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":7}}}]}],"STELLA-LYE":[{"date":"2024-03-04","commitResults":[{"hash":"09ba9eb1ce42d538c3a5ccc09292c0b27252ceb3","isMergeCommit":true,"messageTitle":"Merge pull request #6 from tohlh/update-about-me","messageBody":"Add tohlh\u0027s personal info","fileTypesAndContributionMap":{}},{"hash":"a79bf0389bed7ba3dfee07f868f51863ca55fa37","isMergeCommit":false,"messageTitle":"Update Stella AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":4}}}]}],"jocelyn-soh":[],"tohlh":[{"date":"2024-03-04","commitResults":[{"hash":"558a8e598a3c6d1e65235ce3657ed47ef99709d2","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-W10-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"b225ac386ca9d8d71bdfb4561bc458d960f69a45","isMergeCommit":false,"messageTitle":"Add tohlh\u0027s personal info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":5}}}]},{"date":"2024-03-05","commitResults":[{"hash":"ba5c14fb443856d3fb504f76b5bac2c036f0004a","isMergeCommit":true,"messageTitle":"Merge pull request #7 from STELLA-LYE/Update-AboutUs","messageBody":"Update Stella AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"doyelee0313":{"docs":25,"functional-code":0,"test-code":0},"STELLA-LYE":{"docs":17,"functional-code":0,"test-code":0},"jocelyn-soh":{"docs":0,"functional-code":0,"test-code":0},"tohlh":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"doyelee0313":80.54438,"STELLA-LYE":31.313608,"jocelyn-soh":0.0,"tohlh":34.36686},"authorDisplayNameMap":{"doyelee0313":"CS2103T-W10-4 LEE ..DOYE","STELLA-LYE":"CS2103T-W10-4 STEL..I YU","jocelyn-soh":"CS2103T-W10-4 SOH ..ELYN","tohlh":"CS2103T-W10-4 TOH ..HENG"}} +{"authorDailyContributionsMap":{"doyelee0313":[{"date":"2024-03-05","commitResults":[{"hash":"21e7fd316d98570476976d8bfa3a73cc647c0439","isMergeCommit":false,"messageTitle":"Update Doye AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":15}}},{"hash":"11996a91c0bd56c04e83706baa8ec3280adb5487","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-W10-4/master","messageBody":"Update Doye AboutUs","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"3cd2515a6a52d379fb164e314655685b905a8a78","isMergeCommit":false,"messageTitle":"Updated README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":7}}},{"hash":"9eae64f12dcf5243dcfd1162642bcf9deb24791b","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W10-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"90799a21f0f5973cb73f121dc973693e749c53dd","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"STELLA-LYE":[{"date":"2024-03-04","commitResults":[{"hash":"09ba9eb1ce42d538c3a5ccc09292c0b27252ceb3","isMergeCommit":true,"messageTitle":"Merge pull request #6 from tohlh/update-about-me","messageBody":"Add tohlh\u0027s personal info","fileTypesAndContributionMap":{}},{"hash":"a79bf0389bed7ba3dfee07f868f51863ca55fa37","isMergeCommit":false,"messageTitle":"Update Stella AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":4}}}]},{"date":"2024-03-06","commitResults":[{"hash":"9c42c06c77fd31f9b7a7d25fb1571db8eb05abfe","isMergeCommit":false,"messageTitle":"Change stella image to png file","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"54fbc751a8b00134cc6d6d724f110ff7f504af2e","isMergeCommit":true,"messageTitle":"Merge pull request #17 from jocelyn-soh/site-wide-settings","messageBody":"Update site-wide settings","fileTypesAndContributionMap":{}}]}],"jocelyn-soh":[{"date":"2024-03-06","commitResults":[{"hash":"fa540c85f9e944c25cf7f5d4cb0e417073cbb9c2","isMergeCommit":true,"messageTitle":"Merge pull request #10 from tohlh/update-about-me","messageBody":"Change picture to PNG","fileTypesAndContributionMap":{}},{"hash":"4b61d1733359d3630fefacffccdc9c538096254d","isMergeCommit":false,"messageTitle":"Update Jocelyn\u0027s AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":52}}},{"hash":"3db2a4f846676ad07fb0c133e880bc804bd74d46","isMergeCommit":true,"messageTitle":"Merge pull request #12 from STELLA-LYE/Update-Stella-AboutUs","messageBody":"Change stella image to png file","fileTypesAndContributionMap":{}},{"hash":"0cb2eb404ff9a410156de0ca0b01b871da78f76b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/jocelyn-soh/tp into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"6bd129a3acc610c618221f18ee185e3a901e45ea","isMergeCommit":false,"messageTitle":"Remove whitespaces in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"f019c6f317ec721faf9e14d38bb355f728ca6980","isMergeCommit":false,"messageTitle":"Update site-wide settings","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}}]}],"tohlh":[{"date":"2024-03-04","commitResults":[{"hash":"558a8e598a3c6d1e65235ce3657ed47ef99709d2","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-W10-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"b225ac386ca9d8d71bdfb4561bc458d960f69a45","isMergeCommit":false,"messageTitle":"Add tohlh\u0027s personal info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":5}}}]},{"date":"2024-03-05","commitResults":[{"hash":"ba5c14fb443856d3fb504f76b5bac2c036f0004a","isMergeCommit":true,"messageTitle":"Merge pull request #7 from STELLA-LYE/Update-AboutUs","messageBody":"Update Stella AboutUs","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"da432b2cc0b646fe8a646a7009aceb48831061bf","isMergeCommit":false,"messageTitle":"Change picture to PNG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"88c4d454be61763b339febc55caf1503bc376bca","isMergeCommit":true,"messageTitle":"Merge pull request #9 from doyelee0313/Update-Doye-AboutUs","messageBody":"Update Doye AboutUs","fileTypesAndContributionMap":{}},{"hash":"3e69cb945261cabcad1bb06220461a188f6c3114","isMergeCommit":true,"messageTitle":"Merge pull request #16 from jocelyn-soh/branch-AboutUs","messageBody":"Add Jocelyn\u0027s AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"doyelee0313":{"docs":26,"functional-code":0,"test-code":0},"STELLA-LYE":{"docs":17,"functional-code":0,"test-code":0},"jocelyn-soh":{"docs":23,"functional-code":0,"test-code":0},"tohlh":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"doyelee0313":84.63905,"STELLA-LYE":31.45562,"jocelyn-soh":575.1479,"tohlh":34.13018},"authorDisplayNameMap":{"doyelee0313":"CS2103T-W10-4 LEE ..DOYE","STELLA-LYE":"CS2103T-W10-4 STEL..I YU","jocelyn-soh":"CS2103T-W10-4 SOH ..ELYN","tohlh":"CS2103T-W10-4 TOH ..HENG"}} diff --git a/AY2324S2-CS2103T-W11-2_tp_master/authorship.json b/AY2324S2-CS2103T-W11-2_tp_master/authorship.json index 94e32f1e..4df1cd28 100644 --- a/AY2324S2-CS2103T-W11-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W11-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":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"About Us\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# About Us","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"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":"JuliaPoo"},"content":"### Ken Jin","lastModifiedDate":"2024-03-03"},{"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":"JuliaPoo"},"content":"[[github](https://github.com/Fidget-Spinner/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/fidget-spinner.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"JuliaPoo"},"content":"* Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":22,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: Logic","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"JuliaPoo"},"content":"### Lifu","lastModifiedDate":"2024-03-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"JuliaPoo"},"content":"\u003cimg src\u003d\"images/lifhoshi.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"JuliaPoo"},"content":"[[github](https://github.com/LifHoshi)]","lastModifiedDate":"2024-03-03"},{"lineNumber":29,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/lifhoshi.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"JuliaPoo"},"content":"* Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"JuliaPoo"},"content":"### Jules","lastModifiedDate":"2024-03-03"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"JuliaPoo"},"content":"\u003cimg src\u003d\"images/juliapoo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"JuliaPoo"},"content":"[[homepage](https://juliapoo.github.io/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":39,"author":{"gitId":"JuliaPoo"},"content":"[[github](http://github.com/JuliaPoo)] ","lastModifiedDate":"2024-03-03"},{"lineNumber":40,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/juliapoo.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"JuliaPoo"},"content":"### Jia Jie","lastModifiedDate":"2024-03-03"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"JuliaPoo"},"content":"\u003cimg src\u003d\"images/chuahjiajie.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"JuliaPoo"},"content":"[[github](http://github.com/chuahjiajie)]","lastModifiedDate":"2024-03-03"},{"lineNumber":50,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/chuahjiajie.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: Logic","lastModifiedDate":"2024-03-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"JuliaPoo"},"content":"### Jae Geun","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"JuliaPoo"},"content":"[[github](http://github.com/alphajae11)]","lastModifiedDate":"2024-03-03"},{"lineNumber":60,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/alphajae11.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: Logic","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":25,"-":34,"Fidget-Spinner":4}},{"path":"docs/Configuration.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Configuration guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# Configuration guide","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: `config.json`).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"-":4,"Fidget-Spinner":4}},{"path":"docs/DevOps.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"DevOps guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# DevOps guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- -------------------------------------------------------------------------------------------------------------------- --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## Build automation","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"This project uses Gradle for **build automation and dependency management**. **You are recommended to read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html)**.","lastModifiedDate":"2020-06-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Given below are how to use Gradle for some important project tasks.","lastModifiedDate":"2020-05-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **`clean`**: Deletes the files created during the previous build tasks (e.g. files in the `build` folder).\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" e.g. `./gradlew clean`","lastModifiedDate":"2020-05-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **`shadowJar`**: Uses the ShadowJar plugin to creat a fat JAR file in the `build/lib` folder, *if the current file is outdated*.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" e.g. `./gradlew shadowJar`.","lastModifiedDate":"2020-05-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* **`run`**: Builds and runs the application.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" **`runShadow`**: Builds the application as a fat JAR, and then runs it.","lastModifiedDate":"2020-05-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* **`checkstyleMain`**: Runs the code style check for the main code base.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" **`checkstyleTest`**: Runs the code style check for the test code base.","lastModifiedDate":"2020-05-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **`test`**: Runs all tests.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `./gradlew test` — Runs all tests","lastModifiedDate":"2020-05-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `./gradlew clean test` — Cleans the project and runs tests","lastModifiedDate":"2020-05-26"},{"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":"## Continuous integration (CI)","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the `.github/workflows` folder). No further setting up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Code coverage","lastModifiedDate":"2020-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"As part of CI, this project uses Codecov to generate coverage reports. When CI runs, it will generate code coverage data (based on the tests run by CI) and upload that data to the CodeCov website, which in turn can provide you more info about the coverage of your tests.","lastModifiedDate":"2023-02-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"However, because Codecov is known to run into intermittent problems (e.g., report upload fails) due to issues on the Codecov service side, the CI is configured to pass even if the Codecov task failed. Therefore, developers are advised to check the code coverage levels periodically and take corrective actions if the coverage level falls below desired levels.","lastModifiedDate":"2023-02-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"To enable Codecov for forks of this project, follow the steps given in [this se-edu guide](https://se-education.org/guides/tutorials/codecov.html).","lastModifiedDate":"2023-02-02"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-01-01"},{"lineNumber":52,"author":{"gitId":"-"},"content":"### Repository-wide checks","lastModifiedDate":"2020-07-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"In addition to running Gradle checks, CI includes some repository-wide checks. Unlike the Gradle checks which only cover files used in the build process, these repository-wide checks cover all files in the repository. They check for repository rules which are hard to enforce on development machines such as line ending requirements.","lastModifiedDate":"2020-07-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"These checks are implemented as POSIX shell scripts, and thus can only be run on POSIX-compliant operating systems such as macOS and Linux. To run all checks locally on these operating systems, execute the following in the repository root directory:","lastModifiedDate":"2020-07-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"`./config/travis/run-checks.sh`","lastModifiedDate":"2020-07-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":"Any warnings or errors will be printed out to the console.","lastModifiedDate":"2020-07-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":62,"author":{"gitId":"-"},"content":"**If adding new checks:**","lastModifiedDate":"2020-07-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Checks are implemented as executable `check-*` scripts within the `.github` directory. The `run-checks.sh` script will automatically pick up and run files named as such. That is, you can add more such files if you need and the CI will do the rest.","lastModifiedDate":"2020-07-28"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* Check scripts should print out errors in the format `SEVERITY:FILENAME:LINE: MESSAGE`","lastModifiedDate":"2020-07-28"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * SEVERITY is either ERROR or WARN.","lastModifiedDate":"2020-07-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * FILENAME is the path to the file relative to the current directory.","lastModifiedDate":"2020-07-28"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.","lastModifiedDate":"2020-07-28"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":71,"author":{"gitId":"-"},"content":"* Check scripts must exit with a non-zero exit code if any errors occur.","lastModifiedDate":"2020-07-28"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"## Making a release","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Here are the steps to create a new release.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"1. Update the version number in [`MainApp.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java).","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"1. Generate a fat JAR file using Gradle (i.e., `gradlew shadowJar`).","lastModifiedDate":"2021-08-30"},{"lineNumber":81,"author":{"gitId":"-"},"content":"1. Tag the repo with the version number. e.g. `v0.1`","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"1. [Create a new release using GitHub](https://help.github.com/articles/creating-releases/). Upload the JAR file you created.","lastModifiedDate":"2020-05-26"}],"authorContributionMap":{"-":74,"Fidget-Spinner":8}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":191,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":212,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"alphajae11"},"content":"* has a need to manage a significant amount of CCA information (such as contacts, roles and details)","lastModifiedDate":"2024-03-04"},{"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":"alphajae11"},"content":"**Value proposition**: manage CCA information faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-04"},{"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":"alphajae11"},"content":"|----------|---------------------------|---------------------------|-----------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"alphajae11"},"content":"| `* * *` | `EXCO Member` | Assign roles to contacts | manage my `CCA Member`s |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"alphajae11"},"content":"| `* * *` | `CCA Member` | Identify the `EXCO Member`s | Inform them if I am unable to make it for the CCA session |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"alphajae11"},"content":"| `* * *` | `EXCO Member` | Form groups of contacts | associate who belongs to what CCA |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"alphajae11"},"content":"| | | | |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"alphajae11"},"content":"| | | | |","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"alphajae11"},"content":"| | | | |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"alphajae11"},"content":"(For all use cases below, the **System** is the `CCA Manager` and the **Actor** are the `EXCO Member`s and `CCA Member`s, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"alphajae11"},"content":"#### UC01 - Assign roles to contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"alphajae11"},"content":"1. User requests to list contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"alphajae11"},"content":"2. `CCA Manager` shows a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"alphajae11"},"content":"3. User requests to assign role to the contact","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"alphajae11"},"content":"4. `CCA Manager` assigns role to that contact","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"alphajae11"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"alphajae11"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"alphajae11"},"content":"2a. Provided Non-Integer input for `Index of Contacts`.","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"alphajae11"},"content":" 2a1. `CCA Manager` shows an error message. ","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"alphajae11"},"content":"3a. Provided Integer that is out of range of index","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"alphajae11"},"content":" 3a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"alphajae11"},"content":"4a. Invalid `Role Name`","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"alphajae11"},"content":"5a. Neglected to input `r` or `c` character prior to name","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"alphajae11"},"content":" 5a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"alphajae11"},"content":"#### UC02 - Form groups of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"alphajae11"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"alphajae11"},"content":"1. User requests to list contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"alphajae11"},"content":"2. `CCA Manager` shows a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"alphajae11"},"content":"3. User requests to form a group for a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"alphajae11"},"content":"4. `CCA Manager` forms a group for a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"alphajae11"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"alphajae11"},"content":"2a. Provided Non-Integer input for `Index of Contacts`.","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"alphajae11"},"content":" 2a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"alphajae11"},"content":"3a. Provided Integer that is out of range of index","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"alphajae11"},"content":" 3a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"alphajae11"},"content":"4a. Invalid `Group Name`","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"alphajae11"},"content":"5a. Invalid `Index of Contacts`","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"alphajae11"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"alphajae11"},"content":"#### UC03 - Identify the EXCO members","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"alphajae11"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"alphajae11"},"content":"1. User requests to view the contacts in the EXCO group","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"alphajae11"},"content":"2. AddressBook shows a list of contacts in the EXCO group","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"alphajae11"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"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":382,"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":383,"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":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":390,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":399,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":400,"author":{"gitId":"Fidget-Spinner"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":{"alphajae11":65,"-":326,"Fidget-Spinner":54}},{"path":"docs/Documentation.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Documentation guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Documentation Guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"* We use [**MarkBind**](https://markbind.org/) to manage documentation.","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"* The `docs/` folder contains the source files for the documentation website.","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"* To learn how set it up and maintain the project website, follow the guide [[se-edu/guides] Working with Forked MarkBind sites](https://se-education.org/guides/tutorials/markbind-forked-sites.html) for project documentation.","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"* Also relevant is the [_se-edu/guides **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html).","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Fidget-Spinner"},"content":"**Converting to PDF**","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Fidget-Spinner"},"content":"* See the guide [_se-edu/guides **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html).","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"-":11,"Fidget-Spinner":10}},{"path":"docs/Logging.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Logging guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# Logging guide","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* We are using `java.util.logging` package for logging.","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* The `LogsCenter` class is used to manage the logging levels and logging destinations.","lastModifiedDate":"2020-06-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* The `Logger` for a class can be obtained using `LogsCenter.getLogger(Class)` which will log messages according to the specified logging level.","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* Log messages are output through the console and to a `.log` file.","lastModifiedDate":"2020-06-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* The output logging level can be controlled using the `logLevel` setting in the configuration file (See the [Configuration guide](Configuration.md) section).","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* **When choosing a level for a log message**, follow the conventions given in [_[se-edu/guides] Java: Logging conventions_](https://se-education.org/guides/conventions/java/logging.html).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"-":9,"Fidget-Spinner":4}},{"path":"docs/SettingUp.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Setting up and getting started\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Setting up and getting started","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"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":"## Setting up the project in your computer","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"Fidget-Spinner"},"content":"**Caution:**","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Follow the steps in the following guide precisely. Things will not work out if you deviate in some steps.","lastModifiedDate":"2020-06-07"},{"lineNumber":20,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"First, **fork** this repo, and **clone** the fork into your computer.","lastModifiedDate":"2020-06-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"If you plan to use Intellij IDEA (highly recommended):","lastModifiedDate":"2020-06-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. **Configure the JDK**: Follow the guide [_[se-edu/guides] IDEA: Configuring the JDK_](https://se-education.org/guides/tutorials/intellijJdk.html) to to ensure Intellij is configured to use **JDK 11**.","lastModifiedDate":"2020-06-07"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":" Note: Importing a Gradle project is slightly different from importing a normal Java project.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"1. **Verify the setup**:","lastModifiedDate":"2020-06-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" 1. Run the `seedu.address.Main` and try a few commands.","lastModifiedDate":"2020-06-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" 1. [Run the tests](Testing.md) to ensure they all pass.","lastModifiedDate":"2020-06-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"## Before writing code","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. **Configure the coding style**","lastModifiedDate":"2020-06-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" If using IDEA, follow the guide [_[se-edu/guides] IDEA: Configuring the code style_](https://se-education.org/guides/tutorials/intellijCodeStyle.html) to set up IDEA\u0027s coding style to match ours.","lastModifiedDate":"2020-09-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":" **Tip:**","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Optionally, you can follow the guide [_[se-edu/guides] Using Checkstyle_](https://se-education.org/guides/tutorials/checkstyle.html) to find how to use the CheckStyle within IDEA e.g., to report problems _as_ you write code.","lastModifiedDate":"2020-06-07"},{"lineNumber":46,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. **Set up CI**","lastModifiedDate":"2020-06-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" This project comes with a GitHub Actions config files (in `.github/workflows` folder). When GitHub detects those files, it will run the CI for your project automatically at each push to the `master` branch or to any PR. No set up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"1. **Learn the design**","lastModifiedDate":"2020-06-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [AddressBook’s architecture](DeveloperGuide.md#architecture).","lastModifiedDate":"2020-06-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"1. **Do the tutorials**","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" These tutorials will help you get acquainted with the codebase.","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * [Tracing code](tutorials/TracingCode.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * [Adding a new command](tutorials/AddRemark.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * [Removing fields](tutorials/RemovingFields.md)","lastModifiedDate":"2021-08-01"}],"authorContributionMap":{"-":45,"Fidget-Spinner":16}},{"path":"docs/Testing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Testing guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Testing guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- -------------------------------------------------------------------------------------------------------------------- --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## Running tests","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"There are two ways to run tests.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **Method 1: Using IntelliJ JUnit test runner**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * To run all tests, right-click on the `src/test/java` folder and choose `Run \u0027All Tests\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * To run a subset of tests, you can right-click on a test package,","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" test class, or a test and choose `Run \u0027ABC\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Method 2: Using Gradle**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Open a console and run the command `gradlew clean test` (Mac/Linux: `./gradlew clean test`)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":"**Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"## Types of tests","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"This project has three types of tests:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. *Unit tests* targeting the lowest level methods/classes.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" e.g. `seedu.address.commons.StringUtilTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. *Integration tests* that are checking the integration of multiple code units (those code units are assumed to be working).\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" e.g. `seedu.address.storage.StorageManagerTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" e.g. `seedu.address.logic.LogicManagerTest`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":29,"Fidget-Spinner":12}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"User Guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"LifHoshi"},"content":"# CCA Manager User Guide ℹ️","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"LifHoshi"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"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":"LifHoshi"},"content":"## Quick start 😊","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"LifHoshi"},"content":"\u003e [!important]","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"LifHoshi"},"content":"\u003e 1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"LifHoshi"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"LifHoshi"},"content":"**Notes about how to use:**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"LifHoshi"},"content":"* 1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"LifHoshi"},"content":"* 2. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"LifHoshi"},"content":"* 3. 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":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"LifHoshi"},"content":" ![#f03c15](https://placehold.co/15x15/f03c15/f03c15.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"LifHoshi"},"content":" **A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"LifHoshi"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"LifHoshi"},"content":"### Quick Reference","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"LifHoshi"},"content":"- 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":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"LifHoshi"},"content":" ▶️All commands you can try:","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"LifHoshi"},"content":" * [`add` : Adds a contact to the CCA Manager](#feature-add)","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"LifHoshi"},"content":" * [`list` : Lists all contacts](#feature-list)","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"LifHoshi"},"content":" * [`edit` : Edit a existing person information](#feature-edit)","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"LifHoshi"},"content":" * [`find` : Find a person in the current list](#feature-find)","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"LifHoshi"},"content":" * [`delete` : Delete a contact in the current list](#feature-delete)","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"LifHoshi"},"content":" * [`clear` : Deletes all contacts](#feature-clear)","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"LifHoshi"},"content":" * [`exit` : Exits the app](#feature-exit)","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"LifHoshi"},"content":" * $${\\color{green}More \\space features \\space will \\space be \\space coming \\space in \\space v1.2}$$","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"LifHoshi"},"content":"### Further Help","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"LifHoshi"},"content":" Refer to the [Features](#features) below for details of each command.⬇️⬇️⬇️","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"LifHoshi"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"LifHoshi"},"content":"## Features","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"LifHoshi"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"LifHoshi"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"LifHoshi"},"content":"\u003e [!NOTE]","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"LifHoshi"},"content":"\u003e 1. Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"LifHoshi"},"content":"\u003e 2. Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"LifHoshi"},"content":"\u003e 3. Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"LifHoshi"},"content":"\u003e 4. Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":88,"author":{"gitId":"LifHoshi"},"content":"\u003e 5. Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"LifHoshi"},"content":"**If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.**","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":94,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"LifHoshi"},"content":"_Shows a message explaning how to access the help page._","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"LifHoshi"},"content":"**Format**: `help`","lastModifiedDate":"2024-03-02"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-add\u0027\u003e Adding a person: `add` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"LifHoshi"},"content":"_Adds a person to the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"LifHoshi"},"content":"**Format**: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"Fidget-Spinner"},"content":" ","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"LifHoshi"},"content":"\u003e [!TIP]","lastModifiedDate":"2024-03-02"},{"lineNumber":114,"author":{"gitId":"LifHoshi"},"content":"\u003e A person can have any number of tags (including 0)","lastModifiedDate":"2024-03-02"},{"lineNumber":115,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"LifHoshi"},"content":"**Examples**:","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"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":119,"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":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-list\u0027\u003e Listing all persons : `list` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"LifHoshi"},"content":"_Shows a list of all persons in the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"LifHoshi"},"content":"**Format**: `list`","lastModifiedDate":"2024-03-02"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-edit\u0027\u003e Editing a person : `edit` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"LifHoshi"},"content":"_Edits an existing person in the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"LifHoshi"},"content":"**Format**: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"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":134,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"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":137,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"LifHoshi"},"content":"**Examples**:","lastModifiedDate":"2024-03-02"},{"lineNumber":141,"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":142,"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":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-find\u0027\u003e Locating persons by name: `find` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"LifHoshi"},"content":"_Finds persons whose names contain any of the given keywords._","lastModifiedDate":"2024-03-02"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"LifHoshi"},"content":"**Format**: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2024-03-02"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"LifHoshi"},"content":"**Examples**:","lastModifiedDate":"2024-03-02"},{"lineNumber":158,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-delete\u0027\u003e Deleting a person : `delete` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"LifHoshi"},"content":"_Deletes the specified person from the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"LifHoshi"},"content":"**Format**: `delete INDEX`","lastModifiedDate":"2024-03-02"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"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":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-clear\u0027\u003e Clearing all entries : `clear` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"LifHoshi"},"content":"_Clears all entries from the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"LifHoshi"},"content":"**Format**: `clear`","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-exit\u0027\u003e Exiting the program : `exit` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"LifHoshi"},"content":"_Exits the program._","lastModifiedDate":"2024-03-02"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"LifHoshi"},"content":"**Format**: `exit`","lastModifiedDate":"2024-03-02"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"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":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":194,"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":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":196,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"LifHoshi"},"content":"\u003e[!CAUTION]","lastModifiedDate":"2024-03-02"},{"lineNumber":199,"author":{"gitId":"LifHoshi"},"content":"\u003e 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-03-02"},{"lineNumber":200,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":203,"author":{"gitId":"LifHoshi"},"content":"### Assign roles to contacts`[coming in v1.2]`","lastModifiedDate":"2024-03-02"},{"lineNumber":204,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":205,"author":{"gitId":"LifHoshi"},"content":"_Manage CCA personnel_","lastModifiedDate":"2024-03-02"},{"lineNumber":206,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":207,"author":{"gitId":"LifHoshi"},"content":"### Identify the exco members`[coming in v1.2]`","lastModifiedDate":"2024-03-02"},{"lineNumber":208,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"LifHoshi"},"content":"_Inform them if I am unable to make it for the CCA session_","lastModifiedDate":"2024-03-02"},{"lineNumber":210,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":211,"author":{"gitId":"LifHoshi"},"content":"### form groups of contacts`[coming in v1.2]`","lastModifiedDate":"2024-03-02"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":213,"author":{"gitId":"LifHoshi"},"content":"_Associate who belongs to what CCA_","lastModifiedDate":"2024-03-02"},{"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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"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":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":227,"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":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":229,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":231,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"Fidget-Spinner"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-02-25"},{"lineNumber":235,"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":236,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"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":239,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":130,"Fidget-Spinner":15,"LifHoshi":96}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Fidget-Spinner"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eCCA Manager\u003c/a\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/form\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/header\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Fidget-Spinner"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Fidget-Spinner"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Fidget-Spinner"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Fidget-Spinner"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Fidget-Spinner"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Fidget-Spinner"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Fidget-Spinner"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Fidget-Spinner"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Fidget-Spinner"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Fidget-Spinner"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Fidget-Spinner"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Fidget-Spinner"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Fidget-Spinner"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Fidget-Spinner"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Fidget-Spinner"},"content":"* Tutorials","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Fidget-Spinner"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"Fidget-Spinner"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"Fidget-Spinner"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"Fidget-Spinner"},"content":" {{ content }}","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cfooter\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/footer\u003e","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"Fidget-Spinner":67}},{"path":"docs/_markbind/variables.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cvariable name\u003d\"example\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":"To inject this HTML segment in your markbind files, use {{ example }} where you want to place it.","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":"More generally, surround the segment\u0027s id with double curly braces.","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/variable\u003e","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"Fidget-Spinner":4}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# AddressBook Level-3","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"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":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":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":{"-":17,"Fidget-Spinner":4}},{"path":"docs/stylesheets/main.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Fidget-Spinner"},"content":"mark {","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" background-color: #ff0;","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 5px;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" padding-top: 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Fidget-Spinner"},"content":" padding-bottom: 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":".indented {","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":" padding-left: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":".theme-card img {","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Fidget-Spinner"},"content":" width: 100%;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"/* Scrollbar */","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll::-webkit-scrollbar {","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Fidget-Spinner"},"content":" width: 5px;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll::-webkit-scrollbar-thumb {","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Fidget-Spinner"},"content":" background: #808080;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll::-webkit-scrollbar-track {","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":" background: transparent;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll-blue::-webkit-scrollbar {","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Fidget-Spinner"},"content":" width: 5px;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll-blue::-webkit-scrollbar-thumb {","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Fidget-Spinner"},"content":" background: #00b0ef;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll-blue::-webkit-scrollbar-track {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Fidget-Spinner"},"content":" background: transparent;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"Fidget-Spinner"},"content":"/* Layout containers */","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"Fidget-Spinner"},"content":"#flex-body {","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"Fidget-Spinner"},"content":" display: flex;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"Fidget-Spinner"},"content":" flex: 1;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"Fidget-Spinner"},"content":" align-items: start;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"Fidget-Spinner"},"content":"#content-wrapper {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"Fidget-Spinner"},"content":" flex: 1;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"Fidget-Spinner"},"content":" margin: 0 auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"Fidget-Spinner"},"content":" min-width: 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"Fidget-Spinner"},"content":" max-width: 1000px;","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"Fidget-Spinner"},"content":" overflow-x: auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"Fidget-Spinner"},"content":" padding: 0.8rem 20px 0 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"Fidget-Spinner"},"content":" transition: 0.4s;","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"Fidget-Spinner"},"content":" -webkit-transition: 0.4s;","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"Fidget-Spinner"},"content":"#site-nav,","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"Fidget-Spinner"},"content":"#page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"Fidget-Spinner"},"content":" display: flex;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"Fidget-Spinner"},"content":" flex-direction: column;","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"Fidget-Spinner"},"content":" position: sticky;","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"Fidget-Spinner"},"content":" top: var(--sticky-header-height);","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"Fidget-Spinner"},"content":" flex: 0 0 auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"Fidget-Spinner"},"content":" max-width: 300px;","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"Fidget-Spinner"},"content":" max-height: calc(100vh - var(--sticky-header-height));","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"Fidget-Spinner"},"content":" width: 300px;","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"Fidget-Spinner"},"content":"#site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"Fidget-Spinner"},"content":" border-right: 1px solid lightgrey;","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"Fidget-Spinner"},"content":" padding-bottom: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"Fidget-Spinner"},"content":" z-index: 999;","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"Fidget-Spinner"},"content":".site-nav-top {","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"Fidget-Spinner"},"content":" margin: 0.8rem 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"Fidget-Spinner"},"content":" padding: 0 12px 12px 12px;","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"Fidget-Spinner"},"content":".nav-component {","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"Fidget-Spinner"},"content":" overflow-y: auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":90,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":91,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":92,"author":{"gitId":"Fidget-Spinner"},"content":"#page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":93,"author":{"gitId":"Fidget-Spinner"},"content":" border-left: 1px solid lightgrey;","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"Fidget-Spinner"},"content":"@media screen and (max-width: 1299.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"Fidget-Spinner"},"content":" #page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"Fidget-Spinner"},"content":"/* Bootstrap medium(md) responsive breakpoint */","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"Fidget-Spinner"},"content":"@media screen and (max-width: 991.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"Fidget-Spinner"},"content":" #site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"Fidget-Spinner"},"content":"/* Bootstrap small(sm) responsive breakpoint */","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"Fidget-Spinner"},"content":"@media (max-width: 767.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"Fidget-Spinner"},"content":" .indented {","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"Fidget-Spinner"},"content":" padding-left: 10px;","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"Fidget-Spinner"},"content":" #content-wrapper {","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"Fidget-Spinner"},"content":" padding: 0 10px;","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":120,"author":{"gitId":"Fidget-Spinner"},"content":"/* Bootstrap extra small(xs) responsive breakpoint */","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"Fidget-Spinner"},"content":"@media screen and (max-width: 575.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"Fidget-Spinner"},"content":" #site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":127,"author":{"gitId":"Fidget-Spinner"},"content":"/* Hide site navigation when printing */","lastModifiedDate":"2024-02-25"},{"lineNumber":128,"author":{"gitId":"Fidget-Spinner"},"content":"@media print {","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"Fidget-Spinner"},"content":" #site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":131,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"Fidget-Spinner"},"content":" #page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":135,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"Fidget-Spinner"},"content":" /* Reduce font size when printing */","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"Fidget-Spinner"},"content":" h1 {","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 1.2rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":140,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":141,"author":{"gitId":"Fidget-Spinner"},"content":" h2 {","lastModifiedDate":"2024-02-25"},{"lineNumber":142,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 1.0rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":143,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":144,"author":{"gitId":"Fidget-Spinner"},"content":" h3 {","lastModifiedDate":"2024-02-25"},{"lineNumber":145,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.9rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":146,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":147,"author":{"gitId":"Fidget-Spinner"},"content":" h4 {","lastModifiedDate":"2024-02-25"},{"lineNumber":148,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.8rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"Fidget-Spinner"},"content":" h5 {","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.7rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":153,"author":{"gitId":"Fidget-Spinner"},"content":" body {","lastModifiedDate":"2024-02-25"},{"lineNumber":154,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.65rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":155,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":156,"author":{"gitId":"Fidget-Spinner"},"content":" .btn {","lastModifiedDate":"2024-02-25"},{"lineNumber":157,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.65rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":158,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":159,"author":{"gitId":"Fidget-Spinner"},"content":" img {","lastModifiedDate":"2024-02-25"},{"lineNumber":160,"author":{"gitId":"Fidget-Spinner"},"content":" zoom: 0.8; /* might not work on some browsers */","lastModifiedDate":"2024-02-25"},{"lineNumber":161,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":162,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":163,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":164,"author":{"gitId":"Fidget-Spinner"},"content":"h2,","lastModifiedDate":"2024-02-25"},{"lineNumber":165,"author":{"gitId":"Fidget-Spinner"},"content":"h3,","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"Fidget-Spinner"},"content":"h4,","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"Fidget-Spinner"},"content":"h5,","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"Fidget-Spinner"},"content":"h6 {","lastModifiedDate":"2024-02-25"},{"lineNumber":169,"author":{"gitId":"Fidget-Spinner"},"content":" color: #e46c0a;","lastModifiedDate":"2024-02-25"},{"lineNumber":170,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"Fidget-Spinner":170}},{"path":"docs/team/alphajae11.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Jae Geun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/chuahjiajie.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Jia Jie\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/fidget-spinner.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Ken Jin\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/johndoe.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-25"},{"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":{"-":44,"Fidget-Spinner":2}},{"path":"docs/team/juliapoo.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Jule\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/lifhoshi.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Lifu\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/tutorials/AddRemark.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Tutorial: Adding a command\"","lastModifiedDate":"2020-07-29"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Tutorial: Adding a command","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"Let\u0027s walk you through the implementation of a new command — `remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"This command allows users of the AddressBook application to add optional remarks to people in their address book and edit it if required. The command should have the following format:","lastModifiedDate":"2020-07-29"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"`remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`)","lastModifiedDate":"2020-07-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"We’ll assume that you have already set up the development environment as outlined in the Developer’s Guide.","lastModifiedDate":"2020-07-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## Create a new `remark` command","lastModifiedDate":"2020-07-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"Looking in the `logic.command` package, you will notice that each existing command have their own class. All the commands inherit from the abstract class `Command` which means that they must override `execute()`. Each `Command` returns an instance of `CommandResult` upon success and `CommandResult#feedbackToUser` is printed to the `ResultDisplay`.","lastModifiedDate":"2020-07-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory.","lastModifiedDate":"2020-07-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"For now, let’s keep `RemarkCommand` as simple as possible and print some output. We accomplish that by returning a `CommandResult` with an accompanying message.","lastModifiedDate":"2020-07-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2020-07-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2020-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Changes the remark of an existing person in the address book.","lastModifiedDate":"2020-07-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"remark\";","lastModifiedDate":"2020-07-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2020-07-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new CommandResult(\"Hello from remark\");","lastModifiedDate":"2020-07-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":"### Hook `RemarkCommand` into the application","lastModifiedDate":"2020-07-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":"Now that we have our `RemarkCommand` ready to be executed, we need to update `AddressBookParser#parseCommand()` to recognize the `remark` keyword. Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`.","lastModifiedDate":"2020-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee).","lastModifiedDate":"2022-01-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"### Run the application","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"Run `Main#main` and try out your new `RemarkCommand`. If everything went well, you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"![Output displayed](../images/add-remark/RemarkHello.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"## Change `RemarkCommand` to throw an exception","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":"While we have successfully printed a message to `ResultDisplay`, the command does not do what it is supposed to do. Let’s change the command to throw a `CommandException` to accurately reflect that our command is still a work in progress.","lastModifiedDate":"2020-12-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":63,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/add-remark/RemarkClass.puml\" alt\u003d\"The relationship between RemarkCommand and Command\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":"Following the convention in other commands, we add relevant messages as constants and use them.","lastModifiedDate":"2020-07-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2021-08-01"},{"lineNumber":71,"author":{"gitId":"-"},"content":" + \": Edits the remark of the person identified \"","lastModifiedDate":"2021-08-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":" + \"by the index number used in the last person listing. \"","lastModifiedDate":"2020-07-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" + \"Existing remark will be overwritten by the input.\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2020-07-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" + \"r/ [REMARK]\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2020-07-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" + \"r/ Likes to swim.\";","lastModifiedDate":"2020-07-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_IMPLEMENTED_YET \u003d","lastModifiedDate":"2021-08-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"Remark command not implemented yet\";","lastModifiedDate":"2021-08-01"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET);","lastModifiedDate":"2020-07-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"## Enhancing `RemarkCommand`","lastModifiedDate":"2020-07-29"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` to parse input from the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"### Make the command accept parameters","lastModifiedDate":"2020-07-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"We start by modifying the constructor of `RemarkCommand` to accept an `Index` and a `String`. While we are at it, let’s change the error message to echo the values. While this is not a replacement for tests, it is an obvious way to tell if our code is functioning as intended.","lastModifiedDate":"2020-07-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2020-07-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ARGUMENTS \u003d \"Index: %1$d, Remark: %2$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":103,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":104,"author":{"gitId":"-"},"content":" private final String remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit the remark","lastModifiedDate":"2020-07-29"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @param remark of the person to be updated to","lastModifiedDate":"2020-07-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public RemarkCommand(Index index, String remark) {","lastModifiedDate":"2020-07-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":" requireAllNonNull(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":113,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2020-07-29"},{"lineNumber":114,"author":{"gitId":"-"},"content":" this.remark \u003d remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":" throw new CommandException(","lastModifiedDate":"2021-08-01"},{"lineNumber":119,"author":{"gitId":"-"},"content":" String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark));","lastModifiedDate":"2021-08-01"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2020-07-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2020-07-29"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2020-07-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2020-07-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":" if (!(other instanceof RemarkCommand)) {","lastModifiedDate":"2020-07-29"},{"lineNumber":130,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2020-07-29"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":" RemarkCommand e \u003d (RemarkCommand) other;","lastModifiedDate":"2020-07-29"},{"lineNumber":134,"author":{"gitId":"-"},"content":" return index.equals(e.index)","lastModifiedDate":"2020-07-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":" \u0026\u0026 remark.equals(e.remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":138,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Your code should look something like [this](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-a8e35af8f9c251525063fae36c9852922a7e7195763018eacec60f3a4d87c594) after you are done.","lastModifiedDate":"2022-01-02"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"### Parse user input","lastModifiedDate":"2020-07-29"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. The class must extend the `Parser` interface.","lastModifiedDate":"2020-07-29"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":148,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/add-remark/ParserClass.puml\" alt\u003d\"The relationship between Parser and RemarkCommandParser\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Thankfully, `ArgumentTokenizer#tokenize()` makes it trivial to parse user input. Let’s take a look at the JavaDoc provided for the function to understand what it does.","lastModifiedDate":"2020-07-29"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":152,"author":{"gitId":"-"},"content":"**`ArgumentTokenizer.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":154,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap}","lastModifiedDate":"2020-07-29"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * object that maps prefixes to their respective argument values. Only the","lastModifiedDate":"2020-07-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":" * given prefixes will be recognized in the arguments string.","lastModifiedDate":"2020-07-29"},{"lineNumber":159,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-07-29"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form:","lastModifiedDate":"2020-07-29"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2020-07-29"},{"lineNumber":162,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2020-07-29"},{"lineNumber":163,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their","lastModifiedDate":"2020-07-29"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * arguments","lastModifiedDate":"2020-07-29"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":166,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":168,"author":{"gitId":"-"},"content":"We can tell `ArgumentTokenizer#tokenize()` to look out for our new prefix `r/` and it will return us an instance of `ArgumentMultimap`. Now let’s find out what we need to do in order to obtain the Index and String that we need. Let’s look through `ArgumentMultimap` :","lastModifiedDate":"2020-07-29"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**`ArgumentMultimap.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":172,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":173,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2020-07-29"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":"public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2020-07-29"},{"lineNumber":177,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2020-07-29"},{"lineNumber":178,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() :","lastModifiedDate":"2020-07-29"},{"lineNumber":179,"author":{"gitId":"-"},"content":" Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2020-07-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":181,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":183,"author":{"gitId":"-"},"content":"This appears to be what we need to get a String of the remark. But what about the Index? Let\u0027s take a quick peek at existing `Command` that uses an index to see how it is done.","lastModifiedDate":"2020-07-29"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":185,"author":{"gitId":"-"},"content":"**`DeleteCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":187,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":189,"author":{"gitId":"-"},"content":"return new DeleteCommand(index);","lastModifiedDate":"2020-07-29"},{"lineNumber":190,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":192,"author":{"gitId":"-"},"content":"There appears to be another utility class that obtains an `Index` from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Now that we have the know-how to extract the data that we need from the user’s input, we can parse the user command and create a new instance of `RemarkCommand`, as given below.","lastModifiedDate":"2020-07-29"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**`RemarkCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":198,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":199,"author":{"gitId":"-"},"content":"public RemarkCommand parse(String args) throws ParseException {","lastModifiedDate":"2020-07-29"},{"lineNumber":200,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":201,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(args,","lastModifiedDate":"2020-07-29"},{"lineNumber":202,"author":{"gitId":"-"},"content":" PREFIX_REMARK);","lastModifiedDate":"2020-07-29"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":204,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":205,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-07-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2020-07-29"},{"lineNumber":207,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2020-07-29"},{"lineNumber":208,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2020-07-29"},{"lineNumber":209,"author":{"gitId":"-"},"content":" RemarkCommand.MESSAGE_USAGE), ive);","lastModifiedDate":"2020-07-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":212,"author":{"gitId":"-"},"content":" String remark \u003d argMultimap.getValue(PREFIX_REMARK).orElse(\"\");","lastModifiedDate":"2020-07-29"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":214,"author":{"gitId":"-"},"content":" return new RemarkCommand(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":215,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":216,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":218,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":220,"author":{"gitId":"Fidget-Spinner"},"content":"Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`!","lastModifiedDate":"2024-02-25"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":222,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":224,"author":{"gitId":"-"},"content":"If you are stuck, check out the sample","lastModifiedDate":"2020-07-29"},{"lineNumber":225,"author":{"gitId":"-"},"content":"[here](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-8bf239e8e9529369b577701303ddd96af93178b4ed6735f91c2d8488b20c6b4a).","lastModifiedDate":"2022-01-02"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":227,"author":{"gitId":"-"},"content":"## Add `Remark` to the model","lastModifiedDate":"2020-07-29"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":229,"author":{"gitId":"-"},"content":"Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of person data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person’s name). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person.","lastModifiedDate":"2020-07-29"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":231,"author":{"gitId":"-"},"content":"### Add a new `Remark` class","lastModifiedDate":"2020-07-29"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":233,"author":{"gitId":"-"},"content":"Create a new `Remark` in `seedu.address.model.person`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code.","lastModifiedDate":"2020-07-29"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"A copy-paste and search-replace later, you should have something like [this](https://github.com/se-edu/addressbook-level3/commit/4516e099699baa9e2d51801bd26f016d812dedcc#diff-41bb13c581e280c686198251ad6cc337cd5e27032772f06ed9bf7f1440995ece). Note how `Remark` has no constrains and thus does not require input","lastModifiedDate":"2022-01-02"},{"lineNumber":236,"author":{"gitId":"-"},"content":"validation.","lastModifiedDate":"2020-07-29"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":238,"author":{"gitId":"-"},"content":"### Make use of `Remark`","lastModifiedDate":"2020-07-29"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":240,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. These should be relatively simple changes.","lastModifiedDate":"2020-07-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":242,"author":{"gitId":"-"},"content":"## Add a placeholder element for remark to the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":244,"author":{"gitId":"-"},"content":"Without getting too deep into `fxml`, let’s go on a 5 minute adventure to get some placeholder text to show up for each person.","lastModifiedDate":"2020-07-29"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":246,"author":{"gitId":"-"},"content":"Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688).","lastModifiedDate":"2022-01-02"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":248,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":250,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":251,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-07-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"private Label remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":253,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":256,"author":{"gitId":"-"},"content":"`@FXML` is an annotation that marks a private or protected field and makes it accessible to FXML. It might sound like Greek to you right now, don’t worry — we will get back to it later.","lastModifiedDate":"2020-07-29"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":258,"author":{"gitId":"-"},"content":"Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9).","lastModifiedDate":"2022-01-02"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"**`PersonListCard.fxml`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":262,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-07-29"},{"lineNumber":263,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"remark\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$remark\" /\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":264,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":266,"author":{"gitId":"-"},"content":"That’s it! Fire up the application again and you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"![$remark shows up in each entry](../images/add-remark/$Remark.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":270,"author":{"gitId":"-"},"content":"## Modify `Person` to support a `Remark` field","lastModifiedDate":"2020-07-29"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"Since `PersonCard` displays data from a `Person`, we need to update `Person` to get our `Remark` displayed!","lastModifiedDate":"2020-07-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### Modify `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":276,"author":{"gitId":"-"},"content":"We change the constructor of `Person` to take a `Remark`. We will also need to define new fields and accessors accordingly to store our new addition.","lastModifiedDate":"2020-07-29"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":278,"author":{"gitId":"-"},"content":"### Update other usages of `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":280,"author":{"gitId":"-"},"content":"Unfortunately, a change to `Person` will cause other commands to break, you will have to modify these commands to use the updated `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":282,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":284,"author":{"gitId":"Fidget-Spinner"},"content":"Use the `Find Usages` feature in IntelliJ IDEA on the `Person` class to find these commands.","lastModifiedDate":"2024-02-25"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":286,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Refer to [this commit](https://github.com/se-edu/addressbook-level3/commit/ce998c37e65b92d35c91d28c7822cd139c2c0a5c) and check that you have got everything in order!","lastModifiedDate":"2020-07-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":291,"author":{"gitId":"-"},"content":"## Updating Storage","lastModifiedDate":"2020-07-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":293,"author":{"gitId":"-"},"content":"AddressBook stores data by serializing `JsonAdaptedPerson` into `json` with the help of an external library — Jackson. Let’s update `JsonAdaptedPerson` to work with our new `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":295,"author":{"gitId":"-"},"content":"While the changes to code may be minimal, the test data will have to be updated as well.","lastModifiedDate":"2020-07-29"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":297,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":299,"author":{"gitId":"Fidget-Spinner"},"content":"You must delete AddressBook’s storage file located at `/data/addressbook.json` before running it! Not doing so will cause AddressBook to default to an empty address book!","lastModifiedDate":"2024-02-25"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":301,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"Check out [this commit](https://github.com/se-edu/addressbook-level3/commit/556cbd0e03ff224d7a68afba171ad2eb0ce56bbf)","lastModifiedDate":"2020-07-29"},{"lineNumber":304,"author":{"gitId":"-"},"content":"to see what the changes entail.","lastModifiedDate":"2020-07-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"## Finalizing the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":308,"author":{"gitId":"-"},"content":"Now that we have finalized the `Person` class and its dependencies, we can now bind the `Remark` field to the UI.","lastModifiedDate":"2020-07-29"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":310,"author":{"gitId":"-"},"content":"Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/commit/5b98fee11b6b3f5749b6b943c4f3bd3aa049b692)","lastModifiedDate":"2020-07-29"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":314,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":315,"author":{"gitId":"-"},"content":"public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2020-07-29"},{"lineNumber":316,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":317,"author":{"gitId":"-"},"content":" remark.setText(person.getRemark().value);","lastModifiedDate":"2020-07-29"},{"lineNumber":318,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":319,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":321,"author":{"gitId":"-"},"content":"![The remark label is bound properly!](../images/add-remark/RemarkBound.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":323,"author":{"gitId":"-"},"content":"## Putting everything together","lastModifiedDate":"2020-07-29"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":325,"author":{"gitId":"-"},"content":"After the previous step, we notice a peculiar regression — we went from displaying something to nothing at all. However, this is expected behavior as we are yet to update the `RemarkCommand` to make use of the code we\u0027ve been adding in the last few steps.","lastModifiedDate":"2020-07-29"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":327,"author":{"gitId":"-"},"content":"### Update `RemarkCommand` and `RemarkCommandParser`","lastModifiedDate":"2020-07-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":"In this last step, we modify `RemarkCommand#execute()` to change the `Remark` of a `Person`. Since all fields in a `Person` are immutable, we create a new instance of a `Person` with the values that we want and","lastModifiedDate":"2020-07-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"save it with `Model#setPerson()`.","lastModifiedDate":"2020-07-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ADD_REMARK_SUCCESS \u003d \"Added remark to Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_REMARK_SUCCESS \u003d \"Removed remark from Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":338,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":341,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2020-07-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2020-07-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2020-07-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-07-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new Person(","lastModifiedDate":"2021-08-01"},{"lineNumber":349,"author":{"gitId":"-"},"content":" personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),","lastModifiedDate":"2021-08-01"},{"lineNumber":350,"author":{"gitId":"-"},"content":" personToEdit.getAddress(), remark, personToEdit.getTags());","lastModifiedDate":"2020-07-29"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-07-29"},{"lineNumber":353,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-07-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":355,"author":{"gitId":"-"},"content":" return new CommandResult(generateSuccessMessage(editedPerson));","lastModifiedDate":"2020-07-29"},{"lineNumber":356,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":358,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":359,"author":{"gitId":"-"},"content":" * Generates a command execution success message based on whether","lastModifiedDate":"2021-08-01"},{"lineNumber":360,"author":{"gitId":"-"},"content":" * the remark is added to or removed from","lastModifiedDate":"2021-08-01"},{"lineNumber":361,"author":{"gitId":"-"},"content":" * {@code personToEdit}.","lastModifiedDate":"2020-07-29"},{"lineNumber":362,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":363,"author":{"gitId":"-"},"content":" private String generateSuccessMessage(Person personToEdit) {","lastModifiedDate":"2020-07-29"},{"lineNumber":364,"author":{"gitId":"-"},"content":" String message \u003d !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;","lastModifiedDate":"2020-07-29"},{"lineNumber":365,"author":{"gitId":"-"},"content":" return String.format(message, personToEdit);","lastModifiedDate":"2020-07-29"},{"lineNumber":366,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":367,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":369,"author":{"gitId":"-"},"content":"![Congratulations!](../images/add-remark/RemarkComplete.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":371,"author":{"gitId":"-"},"content":"## Writing tests","lastModifiedDate":"2020-07-29"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":373,"author":{"gitId":"-"},"content":"Tests are crucial to ensuring that bugs don’t slip into the codebase unnoticed. This is especially true for large code bases where a change might lead to unintended behavior.","lastModifiedDate":"2020-07-29"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":375,"author":{"gitId":"-"},"content":"Let’s verify the correctness of our code by writing some tests!","lastModifiedDate":"2020-07-29"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":377,"author":{"gitId":"-"},"content":"Of course you can simply add the test cases manually, like you\u0027ve been doing all along this tutorial. The result would be like the test cases in [here](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01). Alternatively, you can get the help of IntelliJ to generate the skeletons of the test cases, as explained in the next section.","lastModifiedDate":"2022-01-02"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Automatically generating tests","lastModifiedDate":"2020-07-29"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":381,"author":{"gitId":"-"},"content":"The goal is to write effective and efficient tests to ensure that `RemarkCommand#execute()` behaves as expected.","lastModifiedDate":"2020-07-29"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":383,"author":{"gitId":"-"},"content":"The convention for test names is `methodName_testScenario_expectedResult`. An example would be","lastModifiedDate":"2020-07-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"`execute_filteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"Let’s create a test for `RemarkCommand#execute()` to test that adding a remark works. On `IntelliJ IDEA` you can bring up the context menu and choose to `Go To` \\\u003e `Test` or use the appropriate keyboard shortcut.","lastModifiedDate":"2020-07-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":388,"author":{"gitId":"-"},"content":"![Using the context menu to jump to tests](../images/add-remark/ContextMenu.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":390,"author":{"gitId":"-"},"content":"Then, create a test for the `execute` method.","lastModifiedDate":"2020-07-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":392,"author":{"gitId":"-"},"content":"![Creating a test for `execute`.](../images/add-remark/CreateTest.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":394,"author":{"gitId":"-"},"content":"Following convention, let’s change the name of the generated method to `execute_addRemarkUnfilteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":396,"author":{"gitId":"-"},"content":"Let’s use the utility functions provided in `CommandTestUtil`. The functions ensure that commands produce the expected `CommandResult` and output the correct message. In this case, `CommandTestUtil#assertCommandSuccess` is the best fit as we are testing that a `RemarkCommand` will successfully add a `Remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"You should end up with a test that looks something like [this](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49).","lastModifiedDate":"2022-01-02"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":400,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-07-29"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":402,"author":{"gitId":"-"},"content":"This concludes the tutorial for adding a new `Command` to AddressBook.","lastModifiedDate":"2020-07-29"}],"authorContributionMap":{"-":387,"Fidget-Spinner":15}},{"path":"docs/tutorials/RemovingFields.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Tutorial: Removing Fields\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Tutorial: Removing Fields","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003e Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003e — Antoine de Saint-Exupery","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"When working on an existing code base, you will most likely find that some features that are no longer necessary.","lastModifiedDate":"2021-08-01"},{"lineNumber":14,"author":{"gitId":"-"},"content":"This tutorial aims to give you some practice on such a code \u0027removal\u0027 activity by removing the `address` field from `Person` class.","lastModifiedDate":"2021-08-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"success\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"**If you have done the [Add `remark` command tutorial](AddRemark.html) already**, you should know where the code had to be updated to add the field `remark`. From that experience, you can deduce where the code needs to be changed to _remove_ that field too. The removing of the `address` field can be done similarly.","lastModifiedDate":"2021-08-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"However, if you have no such prior knowledge, removing a field can take a quite a bit of detective work. This tutorial takes you through that process. **At least have a read even if you don\u0027t actually do the steps yourself.**","lastModifiedDate":"2021-08-01"},{"lineNumber":22,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- {:toc} --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"## Safely deleting `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"IntelliJ IDEA provides a refactoring tool that can identify *most* parts of a removal easily. Let’s try to use it as much as we can.","lastModifiedDate":"2021-08-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"### Assisted refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"The `address` field in `Person` is actually an instance of the `seedu.address.model.person.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`\u0027s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \\\u003e `Safe Delete` through the menu.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* :bulb: To make things simpler, you can unselect the options `Search in comments and strings` and `Search for text occurrences`","lastModifiedDate":"2021-08-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"![Usages detected](../images/remove/UnsafeDelete.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"Choose to `View Usages` and you should be presented with a list of `Safe Delete Conflicts`. These conflicts describe locations in which the `Address` class is used.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"![List of conflicts](../images/remove/SafeDeleteConflicts.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"Remove usages of `Address` by performing `Safe Delete`s on each entry i.e., double-click on the entry (which takes you to the code in concern, right-click on that entity, and choose `Refactor` -\u003e `Safe delete` as before). You will need to exercise discretion when removing usages of `Address`. Functions like `ParserUtil#parseAddress()` can be safely removed but its usages must be removed as well. Other usages like in `EditPersonDescriptor` may require more careful inspection.","lastModifiedDate":"2021-08-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"Let’s try removing references to `Address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"1. Safe delete the field `address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"1. Select `Yes` when prompted to remove getters and setters.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"1. Select `View Usages` again.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" ![UnsafeDeleteOnField](../images/remove/UnsafeDeleteOnField.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"1. Remove the usages of `address` and select `Do refactor` when you are done.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"Fidget-Spinner"},"content":" **Tip:** Removing usages may result in errors. Exercise discretion and fix them. For example, removing the `address` field from the `Person` class will require you to modify its constructor.","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"1. Repeat the steps for the remaining usages of `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"After you are done, verify that the application still works by compiling and running it again.","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"### Manual refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"Unfortunately, there are usages of `Address` that IntelliJ IDEA cannot identify. You can find them by searching for instances of the word `address` in your code (`Edit` \\\u003e `Find` \\\u003e `Find in path`).","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"Places of interest to look out for would be resources used by the application. `main/resources` contains images and `fxml` files used by the application and `test/resources` contains test data. For example, there is a `$address` in each `PersonCard` that has not been removed nor identified.","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"![$address](../images/remove/$address.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"A quick look at the `PersonCard` class and its `fxml` file quickly reveals why it slipped past the automated refactoring.","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"**`PersonCard.java`**","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"private Label address;","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"...","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":"**`PersonCard.fxml`**","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"After removing the `Label`, we can proceed to formally test our code. If everything went well, you should have most of your tests pass. Fix any remaining errors until the tests all pass.","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"## Tidying up","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"At this point, your application is working as intended and all your tests are passing. What’s left to do is to clean up references to `Address` in test data and documentation.","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"In `src/test/data/`, data meant for testing purposes are stored. While keeping the `address` field in the json files does not cause the tests to fail, it is not good practice to let cruft from old features accumulate.","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"**`invalidPersonAddressBook.json`:**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"```json","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"{","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \"persons\": [ {","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \"name\": \"Person with invalid name field: Ha!ns Mu@ster\",","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \"phone\": \"9482424\",","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \"email\": \"hans@example.com\",","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" \"address\": \"4th street\"","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"You can go through each individual `json` file and manually remove the `address` field.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":104,"Fidget-Spinner":11}},{"path":"docs/tutorials/TracingCode.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Tutorial: Tracing code\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Tutorial: Tracing code","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003e Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code. …​\\[Therefore,\\] making it easy to read makes it easier to write.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003e — Robert C. Martin Clean Code: A Handbook of Agile Software Craftsmanship","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"When trying to understand an unfamiliar code base, one common strategy used is to trace some representative execution path through the code base. One easy way to trace an execution path is to use a debugger to step through the code. In this tutorial, you will be using the IntelliJ IDEA’s debugger to trace the execution path of a specific user command.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- {:toc} --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"## Before we start","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"Before we jump into the code, it is useful to get an idea of the overall structure and the high-level behavior of the application. This is provided in the \u0027Architecture\u0027 section of the developer guide. In particular, the architecture diagram (reproduced below), tells us that the App consists of several components.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ArchitectureDiagram.puml\" alt\u003d\"ArchitectureDiagram\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"It also has a sequence diagram (reproduced below) that tells us how a command propagates through the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"Note how the diagram shows only the execution flows _between_ the main components. That is, it does not show details of the execution path *inside* each component. By hiding those details, the diagram aims to inform the reader about the overall execution path of a command without overwhelming the reader with too much details. In this tutorial, you aim to find those omitted details so that you get a more in-depth understanding of how the code works.","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"Before we proceed, ensure that you have done the following:","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"1. Read the [*Architecture* section of the DG](../DeveloperGuide.md#architecture)","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. Set up the project in Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"1. Learn basic debugging features of Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * If you are using a different IDE, we\u0027ll leave it to you to figure out the equivalent feature to use in your IDE.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * If you are not using an IDE, we\u0027ll let you figure out how to achieve the same using your coding toolchain.","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"## Setting a breakpoint","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"As you know, the first step of debugging is to put in a breakpoint where you want the debugger to pause the execution. For example, if you are trying to understand how the App starts up, you would put a breakpoint in the first statement of the `main` method.","lastModifiedDate":"2021-07-31"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"In our case, we would want to begin the tracing at the very point where the App start processing user input (i.e., somewhere in the UI component), and then trace through how the execution proceeds through the UI component. However, the execution path through a GUI is often somewhat obscure due to various *event-driven mechanisms* used by GUI frameworks, which happens to be the case here too. Therefore, let us put the breakpoint where the `UI` transfers control to the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":46,"author":{"gitId":"-"},"content":"According to the sequence diagram you saw earlier (and repeated above for reference), the `UI` component yields control to the `Logic` component through a method named `execute`. Searching through the code base for an `execute()` method that belongs to the `Logic` component yields a promising candidate in `seedu.address.logic.Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/tracing/searchResultsForExecuteMethod.png\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":50,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":52,"author":{"gitId":"Fidget-Spinner"},"content":"**Intellij Tip:** The [\u0027**Search Everywhere**\u0027 feature](https://www.jetbrains.com/help/idea/searching-everywhere.html) can be used here. In particular, the \u0027**Find Symbol**\u0027 (\u0027Symbol\u0027 here refers to methods, variables, classes etc.) variant of that feature is quite useful here as we are looking for a _method_ named `execute`, not simply the text `execute`.","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":"A quick look at the `seedu.address.logic.Logic` (an extract given below) confirms that this indeed might be what we’re looking for.","lastModifiedDate":"2021-07-31"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":57,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"But apparently, this is an interface, not a concrete implementation.","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"That should be fine because the [Architecture section of the Developer Guide](../DeveloperGuide.html#architecture) tells us that components interact through interfaces. Here\u0027s the relevant diagram:","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ComponentManagers.puml\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"Next, let\u0027s find out which statement(s) in the `UI` code is calling this method, thus transferring control from the `UI` to the `Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":80,"author":{"gitId":"Fidget-Spinner"},"content":"**Intellij Tip:** The [\u0027**Find Usages**\u0027 feature](https://www.jetbrains.com/help/idea/find-highlight-usages.html#find-usages) can find from which parts of the code a class/method/variable is being used.","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"![`Find Usages` tool window. `Edit` \\\u003e `Find` \\\u003e `Find Usages`.](../images/tracing/FindUsages.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Bingo\\! `MainWindow#executeCommand()` seems to be exactly what we’re looking for\\!","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Now let’s set the breakpoint. First, double-click the item to reach the corresponding code. Once there, click on the left gutter to set a breakpoint, as shown below.","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" ![LeftGutter](../images/tracing/LeftGutter.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"## Tracing the execution path","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"Recall from the User Guide that the `edit` command has the format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` For this tutorial we will be issuing the command `edit 1 n/Alice Yeoh`.","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"Fidget-Spinner"},"content":"**Tip:** Over the course of the debugging session, you will encounter every major component in the application. Try to keep track of what happens inside the component and where the execution transfers to another component.","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"1. To start the debugging session, simply `Run` \\\u003e `Debug Main`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"1. When the GUI appears, enter `edit 1 n/Alice Yeoh` into the command box and press `Enter`.","lastModifiedDate":"2021-07-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. The Debugger tool window should show up and show something like this:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":" ![DebuggerStep1](../images/tracing/DebuggerStep1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. Use the _Show execution point_ feature to jump to the line of code that we stopped at:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" ![ShowExecutionPoint](../images/tracing/ShowExecutionPoint.png)\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":108,"author":{"gitId":"-"},"content":" `CommandResult commandResult \u003d logic.execute(commandText);` is the line that you end up at (i.e., the place where we put the breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"1. We are interested in the `logic.execute(commandText)` portion of that line so let’s _Step in_ into that method call:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":" ![StepInto](../images/tracing/StepInto.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"1. We end up in `LogicManager#execute()` (not `Logic#execute` -- but this is expected because we know the `execute()` method in the `Logic` interface is actually implemented by the `LogicManager` class). Let’s take a look at the body of the method. Given below is the same code, with additional explanatory comments.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" **LogicManager\\#execute().**","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throws CommandException, ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" //Logging, safe to ignore","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" //Parse user input from String to a Command","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" //Executes the Command and stores the result","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" //We can deduce that the previous line of code modifies model in some way","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" // since it\u0027s being stored here.","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" throw new CommandException(FILE_OPS_ERROR_MESSAGE + ioe, ioe);","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"1. `LogicManager#execute()` appears to delegate most of the heavy lifting to other components. Let’s take a closer look at each one.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"1. _Step over_ the logging code since it is of no interest to us now.","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":" ![StepOver](../images/tracing/StepOver.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"1. _Step into_ the line where user input in parsed from a String to a Command, which should bring you to the `AddressBookParser#parseCommand()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","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":"1. _Step over_ the statements in that method until you reach the `switch` statement. The \u0027Variables\u0027 window now shows the value of both `commandWord` and `arguments`:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":158,"author":{"gitId":"-"},"content":" ![Variables](../images/tracing/Variables.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"1. We see that the value of `commandWord` is now `edit` but `arguments` is still not processed in any meaningful way.","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"1. Stepping through the `switch` block, we end up at a call to `EditCommandParser().parse()` as expected (because the command we typed is an edit command).","lastModifiedDate":"2021-07-31"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"1. Let’s see what `EditCommandParser#parse()` does by stepping into it. You might have to click the \u0027step into\u0027 button multiple times here because there are two method calls in that statement: `EditCommandParser()` and `parse()`.","lastModifiedDate":"2021-07-31"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":174,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":175,"author":{"gitId":"Fidget-Spinner"},"content":" **Intellij Tip:** Sometimes, you might end up stepping into functions that are not of interest. Simply use the `step out` button to get out of them!","lastModifiedDate":"2024-02-25"},{"lineNumber":176,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"1. Stepping through the method shows that it calls `ArgumentTokenizer#tokenize()` and `ParserUtil#parseIndex()` to obtain the arguments and index required.","lastModifiedDate":"2021-07-31"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"1. The rest of the method seems to exhaustively check for the existence of each possible parameter of the `edit` command and store any possible changes in an `EditPersonDescriptor`. Recall that we can verify the contents of `editPersonDesciptor` through the \u0027Variables\u0027 window.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":181,"author":{"gitId":"-"},"content":" ![EditCommand](../images/tracing/EditCommand.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"1. As you just traced through some code involved in parsing a command, you can take a look at this class diagram to see where the various parsing-related classes you encountered fit into the design of the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":184,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":186,"author":{"gitId":"-"},"content":"1. Let’s continue stepping through until we return to `LogicManager#execute()`.","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" The sequence diagram below shows the details of the execution path through the Logic component. Does the execution path you traced in the code so far match the diagram?\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":189,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/tracing/LogicSequenceDiagram.puml\" alt\u003d\"Tracing an `edit` command through the Logic component\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"1. Now, step over until you read the statement that calls the `execute()` method of the `EditCommand` object received, and step into that `execute()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":" **`EditCommand#execute()`:**","lastModifiedDate":"2021-07-31"},{"lineNumber":194,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, editedPerson));","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"1. As suspected, `command#execute()` does indeed make changes to the `model` object. Specifically,","lastModifiedDate":"2021-07-31"},{"lineNumber":210,"author":{"gitId":"-"},"content":" * it uses the `setPerson()` method (defined in the interface `Model` and implemented in `ModelManager` as per the usual pattern) to update the person data.","lastModifiedDate":"2021-07-31"},{"lineNumber":211,"author":{"gitId":"-"},"content":" * it uses the `updateFilteredPersonList` method to ask the `Model` to populate the \u0027filtered list\u0027 with _all_ persons.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":212,"author":{"gitId":"-"},"content":" FYI, The \u0027filtered list\u0027 is the list of persons resulting from the most recent operation that will be shown to the user immediately after. For the `edit` command, we populate it with all the persons so that the user can see the edited person along with all other persons. If this was a `find` command, we would be setting that list to contain the search results instead.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":213,"author":{"gitId":"-"},"content":" To provide some context, given below is the class diagram of the `Model` component. See if you can figure out where the \u0027filtered list\u0027 of persons is being tracked.","lastModifiedDate":"2021-07-31"},{"lineNumber":214,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e\u003cbr\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":215,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Model` component section of the DG](../DeveloperGuide.html#model-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"1. As you step through the rest of the statements in the `EditCommand#execute()` method, you\u0027ll see that it creates a `CommandResult` object (containing information about the result of the execution) and returns it.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":218,"author":{"gitId":"-"},"content":" Advancing the debugger by one more step should take you back to the middle of the `LogicManager#execute()` method.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"1. Given that you have already seen quite a few classes in the `Logic` component in action, see if you can identify in this partial class diagram some of the classes you\u0027ve encountered so far, and see how they fit into the class structure of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":221,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Logic` component section of the DG](../DeveloperGuide.html#logic-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"1. Similar to before, you can step over/into statements in the `LogicManager#execute()` method to examine how the control is transferred to the `Storage` component and what happens inside that component.","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":228,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"Fidget-Spinner"},"content":" **Intellij Tip:** When trying to step into a statement such as `storage.saveAddressBook(model.getAddressBook())` which contains multiple method calls, Intellij will let you choose (by clicking) which one you want to step into.","lastModifiedDate":"2024-02-25"},{"lineNumber":230,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"1. As you step through the code inside the `Storage` component, you will eventually arrive at the `JsonAddressBook#saveAddressBook()` method which calls the `JsonSerializableAddressBook` constructor, to create an object that can be _serialized_ (i.e., stored in storage medium) in JSON format. That constructor is given below (with added line breaks for easier readability):","lastModifiedDate":"2021-07-31"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":234,"author":{"gitId":"-"},"content":" **`JsonSerializableAddressBook` constructor:**","lastModifiedDate":"2021-07-31"},{"lineNumber":235,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" * {@code JsonSerializableAddressBook}.","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":" persons.addAll(","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" source.getPersonList()","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .stream()","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" .map(JsonAdaptedPerson::new)","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"1. It appears that a `JsonAdaptedPerson` is created for each `Person` and then added to the `JsonSerializableAddressBook`.","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" This is because regular Java objects need to go through an _adaptation_ for them to be suitable to be saved in JSON format.","lastModifiedDate":"2021-07-31"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"1. While you are stepping through the classes in the `Storage` component, here is the component\u0027s class diagram to help you understand how those classes fit into the structure of the component.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":255,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":256,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":257,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Storage` component section of the DG](../DeveloperGuide.html#storage-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"1. We can continue to step through until you reach the end of the `LogicManager#execute()` method and return to the `MainWindow#executeCommand()` method (the place where we put the original breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"1. Stepping into `resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());`, we end up in:","lastModifiedDate":"2021-07-31"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" **`ResultDisplay#setFeedbackToUser()`**","lastModifiedDate":"2021-07-31"},{"lineNumber":264,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"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":"1. Finally, you can step through until you reach the end of`MainWindow#executeCommand()`.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":272,"author":{"gitId":"-"},"content":" :bulb: This may be a good time to read through the [`UI` component section of the DG](../DeveloperGuide.html#ui-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"In this tutorial, we traced a valid edit command from raw user input to the result being displayed to the user. From this tutorial, you learned more about how the various components work together to produce a response to a user command.","lastModifiedDate":"2021-07-31"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"Here are some quick questions you can try to answer based on your execution path tracing. In some cases, you can do further tracing for the given commands to find exactly what happens.","lastModifiedDate":"2021-07-31"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"1. In this tutorial, we traced the \"happy path\" (i.e., no errors). What","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" do you think will happen if we traced the following commands","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":" instead? What exceptions do you think will be thrown (if any), where","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":" will the exceptions be thrown and where will they be handled?","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":" 1. `redit 1 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":" 2. `edit 0 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":" 3. `edit 1 n/Alex Yeoh`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":" 4. `edit 1`","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":" 5. `edit 1 n/アリス ユー`","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":" 6. `edit 1 t/one t/two t/three t/one`","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"2. What components will you have to modify to perform the following","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":" enhancements to the application?","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":" 1. Make command words case-insensitive","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":" 2. Allow `delete` to remove more than one index at a time","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":" 3. Save the address book in the CSV format instead","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":" 4. Add a new command","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":" 5. Add a new field to `Person`","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":" 6. Add a new entity to the address book","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":276,"Fidget-Spinner":35}}] +[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"About Us\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# About Us","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"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":"JuliaPoo"},"content":"### Ken Jin","lastModifiedDate":"2024-03-03"},{"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":"JuliaPoo"},"content":"[[github](https://github.com/Fidget-Spinner/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/fidget-spinner.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"JuliaPoo"},"content":"* Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":22,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: Logic","lastModifiedDate":"2024-03-03"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"JuliaPoo"},"content":"### Lifu","lastModifiedDate":"2024-03-03"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"JuliaPoo"},"content":"\u003cimg src\u003d\"images/lifhoshi.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"JuliaPoo"},"content":"[[github](https://github.com/LifHoshi)]","lastModifiedDate":"2024-03-03"},{"lineNumber":29,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/lifhoshi.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"JuliaPoo"},"content":"* Role: Developer","lastModifiedDate":"2024-03-03"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"JuliaPoo"},"content":"### Jules","lastModifiedDate":"2024-03-03"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"JuliaPoo"},"content":"\u003cimg src\u003d\"images/juliapoo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"JuliaPoo"},"content":"[[homepage](https://juliapoo.github.io/)]","lastModifiedDate":"2024-03-03"},{"lineNumber":39,"author":{"gitId":"JuliaPoo"},"content":"[[github](http://github.com/JuliaPoo)] ","lastModifiedDate":"2024-03-03"},{"lineNumber":40,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/juliapoo.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"JuliaPoo"},"content":"### Jia Jie","lastModifiedDate":"2024-03-03"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"JuliaPoo"},"content":"\u003cimg src\u003d\"images/chuahjiajie.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"JuliaPoo"},"content":"[[github](http://github.com/chuahjiajie)]","lastModifiedDate":"2024-03-03"},{"lineNumber":50,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/chuahjiajie.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: Logic","lastModifiedDate":"2024-03-03"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"JuliaPoo"},"content":"### Jae Geun","lastModifiedDate":"2024-03-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"JuliaPoo"},"content":"[[github](http://github.com/alphajae11)]","lastModifiedDate":"2024-03-03"},{"lineNumber":60,"author":{"gitId":"JuliaPoo"},"content":"[[portfolio](team/alphajae11.md)]","lastModifiedDate":"2024-03-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"JuliaPoo"},"content":"* Responsibilities: Logic","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":25,"-":34,"Fidget-Spinner":4}},{"path":"docs/Configuration.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Configuration guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# Configuration guide","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: `config.json`).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"-":4,"Fidget-Spinner":4}},{"path":"docs/DevOps.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"DevOps guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# DevOps guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- -------------------------------------------------------------------------------------------------------------------- --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## Build automation","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"This project uses Gradle for **build automation and dependency management**. **You are recommended to read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html)**.","lastModifiedDate":"2020-06-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Given below are how to use Gradle for some important project tasks.","lastModifiedDate":"2020-05-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **`clean`**: Deletes the files created during the previous build tasks (e.g. files in the `build` folder).\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" e.g. `./gradlew clean`","lastModifiedDate":"2020-05-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **`shadowJar`**: Uses the ShadowJar plugin to creat a fat JAR file in the `build/lib` folder, *if the current file is outdated*.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" e.g. `./gradlew shadowJar`.","lastModifiedDate":"2020-05-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* **`run`**: Builds and runs the application.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" **`runShadow`**: Builds the application as a fat JAR, and then runs it.","lastModifiedDate":"2020-05-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* **`checkstyleMain`**: Runs the code style check for the main code base.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":32,"author":{"gitId":"-"},"content":" **`checkstyleTest`**: Runs the code style check for the test code base.","lastModifiedDate":"2020-05-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* **`test`**: Runs all tests.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `./gradlew test` — Runs all tests","lastModifiedDate":"2020-05-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `./gradlew clean test` — Cleans the project and runs tests","lastModifiedDate":"2020-05-26"},{"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":"## Continuous integration (CI)","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the `.github/workflows` folder). No further setting up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Code coverage","lastModifiedDate":"2020-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"As part of CI, this project uses Codecov to generate coverage reports. When CI runs, it will generate code coverage data (based on the tests run by CI) and upload that data to the CodeCov website, which in turn can provide you more info about the coverage of your tests.","lastModifiedDate":"2023-02-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"However, because Codecov is known to run into intermittent problems (e.g., report upload fails) due to issues on the Codecov service side, the CI is configured to pass even if the Codecov task failed. Therefore, developers are advised to check the code coverage levels periodically and take corrective actions if the coverage level falls below desired levels.","lastModifiedDate":"2023-02-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"To enable Codecov for forks of this project, follow the steps given in [this se-edu guide](https://se-education.org/guides/tutorials/codecov.html).","lastModifiedDate":"2023-02-02"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-01-01"},{"lineNumber":52,"author":{"gitId":"-"},"content":"### Repository-wide checks","lastModifiedDate":"2020-07-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"In addition to running Gradle checks, CI includes some repository-wide checks. Unlike the Gradle checks which only cover files used in the build process, these repository-wide checks cover all files in the repository. They check for repository rules which are hard to enforce on development machines such as line ending requirements.","lastModifiedDate":"2020-07-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"These checks are implemented as POSIX shell scripts, and thus can only be run on POSIX-compliant operating systems such as macOS and Linux. To run all checks locally on these operating systems, execute the following in the repository root directory:","lastModifiedDate":"2020-07-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"`./config/travis/run-checks.sh`","lastModifiedDate":"2020-07-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":"Any warnings or errors will be printed out to the console.","lastModifiedDate":"2020-07-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":62,"author":{"gitId":"-"},"content":"**If adding new checks:**","lastModifiedDate":"2020-07-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Checks are implemented as executable `check-*` scripts within the `.github` directory. The `run-checks.sh` script will automatically pick up and run files named as such. That is, you can add more such files if you need and the CI will do the rest.","lastModifiedDate":"2020-07-28"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* Check scripts should print out errors in the format `SEVERITY:FILENAME:LINE: MESSAGE`","lastModifiedDate":"2020-07-28"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * SEVERITY is either ERROR or WARN.","lastModifiedDate":"2020-07-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * FILENAME is the path to the file relative to the current directory.","lastModifiedDate":"2020-07-28"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.","lastModifiedDate":"2020-07-28"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":71,"author":{"gitId":"-"},"content":"* Check scripts must exit with a non-zero exit code if any errors occur.","lastModifiedDate":"2020-07-28"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"## Making a release","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Here are the steps to create a new release.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"1. Update the version number in [`MainApp.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java).","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"1. Generate a fat JAR file using Gradle (i.e., `gradlew shadowJar`).","lastModifiedDate":"2021-08-30"},{"lineNumber":81,"author":{"gitId":"-"},"content":"1. Tag the repo with the version number. e.g. `v0.1`","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"1. [Create a new release using GitHub](https://help.github.com/articles/creating-releases/). Upload the JAR file you created.","lastModifiedDate":"2020-05-26"}],"authorContributionMap":{"-":74,"Fidget-Spinner":8}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":191,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":212,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":213,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2024-02-25"},{"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":"alphajae11"},"content":"* has a need to manage a significant amount of CCA information (such as contacts, roles and details)","lastModifiedDate":"2024-03-04"},{"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":"alphajae11"},"content":"**Value proposition**: manage CCA information faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-04"},{"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":"alphajae11"},"content":"|----------|---------------------------|---------------------------|-----------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"alphajae11"},"content":"| `* * *` | `EXCO Member` | Assign roles to contacts | manage my `CCA Member`s |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"alphajae11"},"content":"| `* * *` | `CCA Member` | Identify the `EXCO Member`s | Inform them if I am unable to make it for the CCA session |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"alphajae11"},"content":"| `* * *` | `EXCO Member` | Form groups of contacts | associate who belongs to what CCA |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"alphajae11"},"content":"| | | | |","lastModifiedDate":"2024-03-04"},{"lineNumber":296,"author":{"gitId":"alphajae11"},"content":"| | | | |","lastModifiedDate":"2024-03-04"},{"lineNumber":297,"author":{"gitId":"alphajae11"},"content":"| | | | |","lastModifiedDate":"2024-03-04"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"alphajae11"},"content":"(For all use cases below, the **System** is the `CCA Manager` and the **Actor** are the `EXCO Member`s and `CCA Member`s, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"alphajae11"},"content":"#### UC01 - Assign roles to contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"alphajae11"},"content":"1. User requests to list contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"alphajae11"},"content":"2. `CCA Manager` shows a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"alphajae11"},"content":"3. User requests to assign role to the contact","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"alphajae11"},"content":"4. `CCA Manager` assigns role to that contact","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"alphajae11"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"alphajae11"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"alphajae11"},"content":"2a. Provided Non-Integer input for `Index of Contacts`.","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"alphajae11"},"content":" 2a1. `CCA Manager` shows an error message. ","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"alphajae11"},"content":"3a. Provided Integer that is out of range of index","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"alphajae11"},"content":" 3a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"alphajae11"},"content":"4a. Invalid `Role Name`","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"alphajae11"},"content":"5a. Neglected to input `r` or `c` character prior to name","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"alphajae11"},"content":" 5a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"alphajae11"},"content":"#### UC02 - Form groups of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"alphajae11"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"alphajae11"},"content":"1. User requests to list contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"alphajae11"},"content":"2. `CCA Manager` shows a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"alphajae11"},"content":"3. User requests to form a group for a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"alphajae11"},"content":"4. `CCA Manager` forms a group for a list of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"alphajae11"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"alphajae11"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"alphajae11"},"content":"2a. Provided Non-Integer input for `Index of Contacts`.","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"alphajae11"},"content":" 2a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"alphajae11"},"content":"3a. Provided Integer that is out of range of index","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"alphajae11"},"content":" 3a1. `CCA Manager` shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"alphajae11"},"content":" Use case resumes at step 2","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"alphajae11"},"content":"4a. Invalid `Group Name`","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"alphajae11"},"content":"5a. Invalid `Index of Contacts`","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"alphajae11"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"alphajae11"},"content":"#### UC03 - Identify the EXCO members","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"alphajae11"},"content":"**MSS**","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"alphajae11"},"content":"1. User requests to view the contacts in the EXCO group","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"alphajae11"},"content":"2. AddressBook shows a list of contacts in the EXCO group","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"alphajae11"},"content":"Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"alphajae11"},"content":"```","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"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":382,"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":383,"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":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":390,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":399,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":400,"author":{"gitId":"Fidget-Spinner"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2024-02-25"},{"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":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"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":{"alphajae11":65,"-":326,"Fidget-Spinner":54}},{"path":"docs/Documentation.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Documentation guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Documentation Guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"* We use [**MarkBind**](https://markbind.org/) to manage documentation.","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"* The `docs/` folder contains the source files for the documentation website.","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"* To learn how set it up and maintain the project website, follow the guide [[se-edu/guides] Working with Forked MarkBind sites](https://se-education.org/guides/tutorials/markbind-forked-sites.html) for project documentation.","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"* Also relevant is the [_se-edu/guides **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html).","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"Fidget-Spinner"},"content":"**Converting to PDF**","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Fidget-Spinner"},"content":"* See the guide [_se-edu/guides **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html).","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"-":11,"Fidget-Spinner":10}},{"path":"docs/Logging.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Logging guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# Logging guide","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* We are using `java.util.logging` package for logging.","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* The `LogsCenter` class is used to manage the logging levels and logging destinations.","lastModifiedDate":"2020-06-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* The `Logger` for a class can be obtained using `LogsCenter.getLogger(Class)` which will log messages according to the specified logging level.","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* Log messages are output through the console and to a `.log` file.","lastModifiedDate":"2020-06-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* The output logging level can be controlled using the `logLevel` setting in the configuration file (See the [Configuration guide](Configuration.md) section).","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* **When choosing a level for a log message**, follow the conventions given in [_[se-edu/guides] Java: Logging conventions_](https://se-education.org/guides/conventions/java/logging.html).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"-":9,"Fidget-Spinner":4}},{"path":"docs/SettingUp.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Setting up and getting started\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Setting up and getting started","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"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":"## Setting up the project in your computer","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"Fidget-Spinner"},"content":"**Caution:**","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Follow the steps in the following guide precisely. Things will not work out if you deviate in some steps.","lastModifiedDate":"2020-06-07"},{"lineNumber":20,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"First, **fork** this repo, and **clone** the fork into your computer.","lastModifiedDate":"2020-06-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"If you plan to use Intellij IDEA (highly recommended):","lastModifiedDate":"2020-06-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. **Configure the JDK**: Follow the guide [_[se-edu/guides] IDEA: Configuring the JDK_](https://se-education.org/guides/tutorials/intellijJdk.html) to to ensure Intellij is configured to use **JDK 11**.","lastModifiedDate":"2020-06-07"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":" Note: Importing a Gradle project is slightly different from importing a normal Java project.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":"1. **Verify the setup**:","lastModifiedDate":"2020-06-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" 1. Run the `seedu.address.Main` and try a few commands.","lastModifiedDate":"2020-06-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":" 1. [Run the tests](Testing.md) to ensure they all pass.","lastModifiedDate":"2020-06-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"## Before writing code","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. **Configure the coding style**","lastModifiedDate":"2020-06-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" If using IDEA, follow the guide [_[se-edu/guides] IDEA: Configuring the code style_](https://se-education.org/guides/tutorials/intellijCodeStyle.html) to set up IDEA\u0027s coding style to match ours.","lastModifiedDate":"2020-09-15"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":" **Tip:**","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Optionally, you can follow the guide [_[se-edu/guides] Using Checkstyle_](https://se-education.org/guides/tutorials/checkstyle.html) to find how to use the CheckStyle within IDEA e.g., to report problems _as_ you write code.","lastModifiedDate":"2020-06-07"},{"lineNumber":46,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. **Set up CI**","lastModifiedDate":"2020-06-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" This project comes with a GitHub Actions config files (in `.github/workflows` folder). When GitHub detects those files, it will run the CI for your project automatically at each push to the `master` branch or to any PR. No set up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"1. **Learn the design**","lastModifiedDate":"2020-06-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [AddressBook’s architecture](DeveloperGuide.md#architecture).","lastModifiedDate":"2020-06-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"1. **Do the tutorials**","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" These tutorials will help you get acquainted with the codebase.","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * [Tracing code](tutorials/TracingCode.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * [Adding a new command](tutorials/AddRemark.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * [Removing fields](tutorials/RemovingFields.md)","lastModifiedDate":"2021-08-01"}],"authorContributionMap":{"-":45,"Fidget-Spinner":16}},{"path":"docs/Testing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"Testing guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Testing guide","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- -------------------------------------------------------------------------------------------------------------------- --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## Running tests","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"There are two ways to run tests.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **Method 1: Using IntelliJ JUnit test runner**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * To run all tests, right-click on the `src/test/java` folder and choose `Run \u0027All Tests\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * To run a subset of tests, you can right-click on a test package,","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":" test class, or a test and choose `Run \u0027ABC\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Method 2: Using Gradle**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Open a console and run the command `gradlew clean test` (Mac/Linux: `./gradlew clean test`)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":"**Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"## Types of tests","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"This project has three types of tests:","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. *Unit tests* targeting the lowest level methods/classes.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" e.g. `seedu.address.commons.StringUtilTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. *Integration tests* that are checking the integration of multiple code units (those code units are assumed to be working).\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" e.g. `seedu.address.storage.StorageManagerTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" e.g. `seedu.address.logic.LogicManagerTest`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":29,"Fidget-Spinner":12}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"User Guide\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"LifHoshi"},"content":"# CCA Manager User Guide ℹ️","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"LifHoshi"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2024-02-25"},{"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":"LifHoshi"},"content":"## Quick start 😊","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"LifHoshi"},"content":"\u003e [!important]","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"LifHoshi"},"content":"\u003e 1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"LifHoshi"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"LifHoshi"},"content":"**Notes about how to use:**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"LifHoshi"},"content":"* 1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"LifHoshi"},"content":"* 2. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"LifHoshi"},"content":"* 3. 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":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"LifHoshi"},"content":" ![#f03c15](https://placehold.co/15x15/f03c15/f03c15.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"LifHoshi"},"content":" **A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"LifHoshi"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"LifHoshi"},"content":"### Quick Reference","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"LifHoshi"},"content":"- 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":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"LifHoshi"},"content":" ▶️All commands you can try:","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"LifHoshi"},"content":" * [`add` : Adds a contact to the CCA Manager](#feature-add)","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"LifHoshi"},"content":" * [`list` : Lists all contacts](#feature-list)","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"LifHoshi"},"content":" * [`edit` : Edit a existing person information](#feature-edit)","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"LifHoshi"},"content":" * [`find` : Find a person in the current list](#feature-find)","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"LifHoshi"},"content":" * [`delete` : Delete a contact in the current list](#feature-delete)","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"LifHoshi"},"content":" * [`clear` : Deletes all contacts](#feature-clear)","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"LifHoshi"},"content":" * [`exit` : Exits the app](#feature-exit)","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"LifHoshi"},"content":" * $${\\color{green}More \\space features \\space will \\space be \\space coming \\space in \\space v1.2}$$","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"LifHoshi"},"content":"### Further Help","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"LifHoshi"},"content":" Refer to the [Features](#features) below for details of each command.⬇️⬇️⬇️⬇️","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"LifHoshi"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"LifHoshi"},"content":"## Features","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"LifHoshi"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"LifHoshi"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"LifHoshi"},"content":"\u003e [!NOTE]","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"LifHoshi"},"content":"\u003e 1. Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"LifHoshi"},"content":"\u003e 2. Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"LifHoshi"},"content":"\u003e 3. Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"LifHoshi"},"content":"\u003e 4. Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":88,"author":{"gitId":"LifHoshi"},"content":"\u003e 5. Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"LifHoshi"},"content":"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"LifHoshi"},"content":"\u003e For example, if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"LifHoshi"},"content":"**If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.**","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":94,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"LifHoshi"},"content":"_Shows a message explaning how to access the help page._","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"LifHoshi"},"content":"**Format**: `help`","lastModifiedDate":"2024-03-02"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-add\u0027\u003e Adding a person: `add` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"LifHoshi"},"content":"_Adds a person to the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"LifHoshi"},"content":"**Format**: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"Fidget-Spinner"},"content":" ","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"LifHoshi"},"content":"\u003e [!TIP]","lastModifiedDate":"2024-03-02"},{"lineNumber":114,"author":{"gitId":"LifHoshi"},"content":"\u003e A person can have any number of tags (including 0)","lastModifiedDate":"2024-03-02"},{"lineNumber":115,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"LifHoshi"},"content":"**Examples**:","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"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":119,"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":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-list\u0027\u003e Listing all persons : `list` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"LifHoshi"},"content":"_Shows a list of all persons in the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"LifHoshi"},"content":"**Format**: `list`","lastModifiedDate":"2024-03-02"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-edit\u0027\u003e Editing a person : `edit` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"LifHoshi"},"content":"_Edits an existing person in the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"LifHoshi"},"content":"**Format**: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"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":134,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"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":137,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"LifHoshi"},"content":"**Examples**:","lastModifiedDate":"2024-03-02"},{"lineNumber":141,"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":142,"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":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-find\u0027\u003e Locating persons by name: `find` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"LifHoshi"},"content":"_Finds persons whose names contain any of the given keywords._","lastModifiedDate":"2024-03-02"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"LifHoshi"},"content":"**Format**: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2024-03-02"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"LifHoshi"},"content":"**Examples**:","lastModifiedDate":"2024-03-02"},{"lineNumber":158,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-delete\u0027\u003e Deleting a person : `delete` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"LifHoshi"},"content":"_Deletes the specified person from the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"LifHoshi"},"content":"**Format**: `delete INDEX`","lastModifiedDate":"2024-03-02"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"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":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-clear\u0027\u003e Clearing all entries : `clear` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"LifHoshi"},"content":"_Clears all entries from the address book._","lastModifiedDate":"2024-03-02"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"LifHoshi"},"content":"**Format**: `clear`","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"LifHoshi"},"content":"### \u003cspan id\u003d\u0027feature-exit\u0027\u003e Exiting the program : `exit` \u003c/span\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"LifHoshi"},"content":"_Exits the program._","lastModifiedDate":"2024-03-02"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"LifHoshi"},"content":"**Format**: `exit`","lastModifiedDate":"2024-03-02"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"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":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":194,"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":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":196,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":197,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":198,"author":{"gitId":"LifHoshi"},"content":"\u003e[!CAUTION]","lastModifiedDate":"2024-03-02"},{"lineNumber":199,"author":{"gitId":"LifHoshi"},"content":"\u003e 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-03-02"},{"lineNumber":200,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":201,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":203,"author":{"gitId":"LifHoshi"},"content":"### Assign roles to contacts`[coming in v1.2]`","lastModifiedDate":"2024-03-02"},{"lineNumber":204,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":205,"author":{"gitId":"LifHoshi"},"content":"_Manage CCA personnel_","lastModifiedDate":"2024-03-02"},{"lineNumber":206,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":207,"author":{"gitId":"LifHoshi"},"content":"### Identify the exco members`[coming in v1.2]`","lastModifiedDate":"2024-03-02"},{"lineNumber":208,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"LifHoshi"},"content":"_Inform them if I am unable to make it for the CCA session_","lastModifiedDate":"2024-03-02"},{"lineNumber":210,"author":{"gitId":"LifHoshi"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":211,"author":{"gitId":"LifHoshi"},"content":"### form groups of contacts`[coming in v1.2]`","lastModifiedDate":"2024-03-02"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":213,"author":{"gitId":"LifHoshi"},"content":"_Associate who belongs to what CCA_","lastModifiedDate":"2024-03-02"},{"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":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"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":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":227,"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":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":229,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":231,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"Fidget-Spinner"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-02-25"},{"lineNumber":235,"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":236,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"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":239,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":130,"Fidget-Spinner":15,"LifHoshi":96}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Fidget-Spinner"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eCCA Manager\u003c/a\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/form\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/li\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/header\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Fidget-Spinner"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Fidget-Spinner"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Fidget-Spinner"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Fidget-Spinner"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Fidget-Spinner"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Fidget-Spinner"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Fidget-Spinner"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Fidget-Spinner"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Fidget-Spinner"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Fidget-Spinner"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Fidget-Spinner"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Fidget-Spinner"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Fidget-Spinner"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Fidget-Spinner"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Fidget-Spinner"},"content":"* Tutorials","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Fidget-Spinner"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"Fidget-Spinner"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"Fidget-Spinner"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"Fidget-Spinner"},"content":" {{ content }}","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/nav\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cfooter\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"Fidget-Spinner"},"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":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/footer\u003e","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"Fidget-Spinner":67}},{"path":"docs/_markbind/variables.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cvariable name\u003d\"example\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":"To inject this HTML segment in your markbind files, use {{ example }} where you want to place it.","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":"More generally, surround the segment\u0027s id with double curly braces.","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/variable\u003e","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"Fidget-Spinner":4}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"\"","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"# AddressBook Level-3","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"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":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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":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":{"-":17,"Fidget-Spinner":4}},{"path":"docs/stylesheets/main.css","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"Fidget-Spinner"},"content":"mark {","lastModifiedDate":"2024-02-25"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" background-color: #ff0;","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 5px;","lastModifiedDate":"2024-02-25"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" padding-top: 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Fidget-Spinner"},"content":" padding-bottom: 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":".indented {","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":" padding-left: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":11,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Fidget-Spinner"},"content":".theme-card img {","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Fidget-Spinner"},"content":" width: 100%;","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"/* Scrollbar */","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll::-webkit-scrollbar {","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Fidget-Spinner"},"content":" width: 5px;","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll::-webkit-scrollbar-thumb {","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Fidget-Spinner"},"content":" background: #808080;","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll::-webkit-scrollbar-track {","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Fidget-Spinner"},"content":" background: transparent;","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll-blue::-webkit-scrollbar {","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Fidget-Spinner"},"content":" width: 5px;","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll-blue::-webkit-scrollbar-thumb {","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Fidget-Spinner"},"content":" background: #00b0ef;","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Fidget-Spinner"},"content":".slim-scroll-blue::-webkit-scrollbar-track {","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Fidget-Spinner"},"content":" background: transparent;","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Fidget-Spinner"},"content":" border-radius: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":46,"author":{"gitId":"Fidget-Spinner"},"content":"/* Layout containers */","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":48,"author":{"gitId":"Fidget-Spinner"},"content":"#flex-body {","lastModifiedDate":"2024-02-25"},{"lineNumber":49,"author":{"gitId":"Fidget-Spinner"},"content":" display: flex;","lastModifiedDate":"2024-02-25"},{"lineNumber":50,"author":{"gitId":"Fidget-Spinner"},"content":" flex: 1;","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"Fidget-Spinner"},"content":" align-items: start;","lastModifiedDate":"2024-02-25"},{"lineNumber":52,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"Fidget-Spinner"},"content":"#content-wrapper {","lastModifiedDate":"2024-02-25"},{"lineNumber":55,"author":{"gitId":"Fidget-Spinner"},"content":" flex: 1;","lastModifiedDate":"2024-02-25"},{"lineNumber":56,"author":{"gitId":"Fidget-Spinner"},"content":" margin: 0 auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"Fidget-Spinner"},"content":" min-width: 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":58,"author":{"gitId":"Fidget-Spinner"},"content":" max-width: 1000px;","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"Fidget-Spinner"},"content":" overflow-x: auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"Fidget-Spinner"},"content":" padding: 0.8rem 20px 0 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":61,"author":{"gitId":"Fidget-Spinner"},"content":" transition: 0.4s;","lastModifiedDate":"2024-02-25"},{"lineNumber":62,"author":{"gitId":"Fidget-Spinner"},"content":" -webkit-transition: 0.4s;","lastModifiedDate":"2024-02-25"},{"lineNumber":63,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":65,"author":{"gitId":"Fidget-Spinner"},"content":"#site-nav,","lastModifiedDate":"2024-02-25"},{"lineNumber":66,"author":{"gitId":"Fidget-Spinner"},"content":"#page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":67,"author":{"gitId":"Fidget-Spinner"},"content":" display: flex;","lastModifiedDate":"2024-02-25"},{"lineNumber":68,"author":{"gitId":"Fidget-Spinner"},"content":" flex-direction: column;","lastModifiedDate":"2024-02-25"},{"lineNumber":69,"author":{"gitId":"Fidget-Spinner"},"content":" position: sticky;","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"Fidget-Spinner"},"content":" top: var(--sticky-header-height);","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"Fidget-Spinner"},"content":" flex: 0 0 auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":72,"author":{"gitId":"Fidget-Spinner"},"content":" max-width: 300px;","lastModifiedDate":"2024-02-25"},{"lineNumber":73,"author":{"gitId":"Fidget-Spinner"},"content":" max-height: calc(100vh - var(--sticky-header-height));","lastModifiedDate":"2024-02-25"},{"lineNumber":74,"author":{"gitId":"Fidget-Spinner"},"content":" width: 300px;","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":76,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":77,"author":{"gitId":"Fidget-Spinner"},"content":"#site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":78,"author":{"gitId":"Fidget-Spinner"},"content":" border-right: 1px solid lightgrey;","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"Fidget-Spinner"},"content":" padding-bottom: 20px;","lastModifiedDate":"2024-02-25"},{"lineNumber":80,"author":{"gitId":"Fidget-Spinner"},"content":" z-index: 999;","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":83,"author":{"gitId":"Fidget-Spinner"},"content":".site-nav-top {","lastModifiedDate":"2024-02-25"},{"lineNumber":84,"author":{"gitId":"Fidget-Spinner"},"content":" margin: 0.8rem 0;","lastModifiedDate":"2024-02-25"},{"lineNumber":85,"author":{"gitId":"Fidget-Spinner"},"content":" padding: 0 12px 12px 12px;","lastModifiedDate":"2024-02-25"},{"lineNumber":86,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":87,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":88,"author":{"gitId":"Fidget-Spinner"},"content":".nav-component {","lastModifiedDate":"2024-02-25"},{"lineNumber":89,"author":{"gitId":"Fidget-Spinner"},"content":" overflow-y: auto;","lastModifiedDate":"2024-02-25"},{"lineNumber":90,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":91,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":92,"author":{"gitId":"Fidget-Spinner"},"content":"#page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":93,"author":{"gitId":"Fidget-Spinner"},"content":" border-left: 1px solid lightgrey;","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":96,"author":{"gitId":"Fidget-Spinner"},"content":"@media screen and (max-width: 1299.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"Fidget-Spinner"},"content":" #page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":99,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":100,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":101,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":102,"author":{"gitId":"Fidget-Spinner"},"content":"/* Bootstrap medium(md) responsive breakpoint */","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"Fidget-Spinner"},"content":"@media screen and (max-width: 991.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":104,"author":{"gitId":"Fidget-Spinner"},"content":" #site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":106,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":108,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":109,"author":{"gitId":"Fidget-Spinner"},"content":"/* Bootstrap small(sm) responsive breakpoint */","lastModifiedDate":"2024-02-25"},{"lineNumber":110,"author":{"gitId":"Fidget-Spinner"},"content":"@media (max-width: 767.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":111,"author":{"gitId":"Fidget-Spinner"},"content":" .indented {","lastModifiedDate":"2024-02-25"},{"lineNumber":112,"author":{"gitId":"Fidget-Spinner"},"content":" padding-left: 10px;","lastModifiedDate":"2024-02-25"},{"lineNumber":113,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":114,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":115,"author":{"gitId":"Fidget-Spinner"},"content":" #content-wrapper {","lastModifiedDate":"2024-02-25"},{"lineNumber":116,"author":{"gitId":"Fidget-Spinner"},"content":" padding: 0 10px;","lastModifiedDate":"2024-02-25"},{"lineNumber":117,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":118,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":119,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":120,"author":{"gitId":"Fidget-Spinner"},"content":"/* Bootstrap extra small(xs) responsive breakpoint */","lastModifiedDate":"2024-02-25"},{"lineNumber":121,"author":{"gitId":"Fidget-Spinner"},"content":"@media screen and (max-width: 575.98px) {","lastModifiedDate":"2024-02-25"},{"lineNumber":122,"author":{"gitId":"Fidget-Spinner"},"content":" #site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":123,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":124,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":125,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":126,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":127,"author":{"gitId":"Fidget-Spinner"},"content":"/* Hide site navigation when printing */","lastModifiedDate":"2024-02-25"},{"lineNumber":128,"author":{"gitId":"Fidget-Spinner"},"content":"@media print {","lastModifiedDate":"2024-02-25"},{"lineNumber":129,"author":{"gitId":"Fidget-Spinner"},"content":" #site-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":130,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":131,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"Fidget-Spinner"},"content":" #page-nav {","lastModifiedDate":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"Fidget-Spinner"},"content":" display: none;","lastModifiedDate":"2024-02-25"},{"lineNumber":135,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"Fidget-Spinner"},"content":" /* Reduce font size when printing */","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"Fidget-Spinner"},"content":" h1 {","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 1.2rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":140,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":141,"author":{"gitId":"Fidget-Spinner"},"content":" h2 {","lastModifiedDate":"2024-02-25"},{"lineNumber":142,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 1.0rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":143,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":144,"author":{"gitId":"Fidget-Spinner"},"content":" h3 {","lastModifiedDate":"2024-02-25"},{"lineNumber":145,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.9rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":146,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":147,"author":{"gitId":"Fidget-Spinner"},"content":" h4 {","lastModifiedDate":"2024-02-25"},{"lineNumber":148,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.8rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":150,"author":{"gitId":"Fidget-Spinner"},"content":" h5 {","lastModifiedDate":"2024-02-25"},{"lineNumber":151,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.7rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":152,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":153,"author":{"gitId":"Fidget-Spinner"},"content":" body {","lastModifiedDate":"2024-02-25"},{"lineNumber":154,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.65rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":155,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":156,"author":{"gitId":"Fidget-Spinner"},"content":" .btn {","lastModifiedDate":"2024-02-25"},{"lineNumber":157,"author":{"gitId":"Fidget-Spinner"},"content":" font-size: 0.65rem !important;","lastModifiedDate":"2024-02-25"},{"lineNumber":158,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":159,"author":{"gitId":"Fidget-Spinner"},"content":" img {","lastModifiedDate":"2024-02-25"},{"lineNumber":160,"author":{"gitId":"Fidget-Spinner"},"content":" zoom: 0.8; /* might not work on some browsers */","lastModifiedDate":"2024-02-25"},{"lineNumber":161,"author":{"gitId":"Fidget-Spinner"},"content":" }","lastModifiedDate":"2024-02-25"},{"lineNumber":162,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"},{"lineNumber":163,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":164,"author":{"gitId":"Fidget-Spinner"},"content":"h2,","lastModifiedDate":"2024-02-25"},{"lineNumber":165,"author":{"gitId":"Fidget-Spinner"},"content":"h3,","lastModifiedDate":"2024-02-25"},{"lineNumber":166,"author":{"gitId":"Fidget-Spinner"},"content":"h4,","lastModifiedDate":"2024-02-25"},{"lineNumber":167,"author":{"gitId":"Fidget-Spinner"},"content":"h5,","lastModifiedDate":"2024-02-25"},{"lineNumber":168,"author":{"gitId":"Fidget-Spinner"},"content":"h6 {","lastModifiedDate":"2024-02-25"},{"lineNumber":169,"author":{"gitId":"Fidget-Spinner"},"content":" color: #e46c0a;","lastModifiedDate":"2024-02-25"},{"lineNumber":170,"author":{"gitId":"Fidget-Spinner"},"content":"}","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"Fidget-Spinner":170}},{"path":"docs/team/alphajae11.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Jae Geun\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/chuahjiajie.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Jia Jie\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/fidget-spinner.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Ken Jin\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/johndoe.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"Fidget-Spinner"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-02-25"},{"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":{"-":44,"Fidget-Spinner":2}},{"path":"docs/team/juliapoo.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Jule\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/team/lifhoshi.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":2,"author":{"gitId":"JuliaPoo"},"content":" layout: default.md","lastModifiedDate":"2024-03-03"},{"lineNumber":3,"author":{"gitId":"JuliaPoo"},"content":" title: \"Lifu\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-03"},{"lineNumber":4,"author":{"gitId":"JuliaPoo"},"content":"---","lastModifiedDate":"2024-03-03"},{"lineNumber":5,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":6,"author":{"gitId":"JuliaPoo"},"content":"### Project: CCA Manager","lastModifiedDate":"2024-03-03"},{"lineNumber":7,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":8,"author":{"gitId":"JuliaPoo"},"content":"CCA Manager 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, CCA Manager can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-03"},{"lineNumber":9,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":10,"author":{"gitId":"JuliaPoo"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":11,"author":{"gitId":"JuliaPoo"},"content":"","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"JuliaPoo":11}},{"path":"docs/tutorials/AddRemark.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Tutorial: Adding a command\"","lastModifiedDate":"2020-07-29"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Tutorial: Adding a command","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"Let\u0027s walk you through the implementation of a new command — `remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"This command allows users of the AddressBook application to add optional remarks to people in their address book and edit it if required. The command should have the following format:","lastModifiedDate":"2020-07-29"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"`remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`)","lastModifiedDate":"2020-07-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"We’ll assume that you have already set up the development environment as outlined in the Developer’s Guide.","lastModifiedDate":"2020-07-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## Create a new `remark` command","lastModifiedDate":"2020-07-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"Looking in the `logic.command` package, you will notice that each existing command have their own class. All the commands inherit from the abstract class `Command` which means that they must override `execute()`. Each `Command` returns an instance of `CommandResult` upon success and `CommandResult#feedbackToUser` is printed to the `ResultDisplay`.","lastModifiedDate":"2020-07-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory.","lastModifiedDate":"2020-07-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"For now, let’s keep `RemarkCommand` as simple as possible and print some output. We accomplish that by returning a `CommandResult` with an accompanying message.","lastModifiedDate":"2020-07-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2020-07-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2020-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Changes the remark of an existing person in the address book.","lastModifiedDate":"2020-07-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"remark\";","lastModifiedDate":"2020-07-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2020-07-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new CommandResult(\"Hello from remark\");","lastModifiedDate":"2020-07-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":"### Hook `RemarkCommand` into the application","lastModifiedDate":"2020-07-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":49,"author":{"gitId":"-"},"content":"Now that we have our `RemarkCommand` ready to be executed, we need to update `AddressBookParser#parseCommand()` to recognize the `remark` keyword. Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`.","lastModifiedDate":"2020-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee).","lastModifiedDate":"2022-01-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"### Run the application","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"Run `Main#main` and try out your new `RemarkCommand`. If everything went well, you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"![Output displayed](../images/add-remark/RemarkHello.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"## Change `RemarkCommand` to throw an exception","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":"While we have successfully printed a message to `ResultDisplay`, the command does not do what it is supposed to do. Let’s change the command to throw a `CommandException` to accurately reflect that our command is still a work in progress.","lastModifiedDate":"2020-12-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":63,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/add-remark/RemarkClass.puml\" alt\u003d\"The relationship between RemarkCommand and Command\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":"Following the convention in other commands, we add relevant messages as constants and use them.","lastModifiedDate":"2020-07-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2021-08-01"},{"lineNumber":71,"author":{"gitId":"-"},"content":" + \": Edits the remark of the person identified \"","lastModifiedDate":"2021-08-01"},{"lineNumber":72,"author":{"gitId":"-"},"content":" + \"by the index number used in the last person listing. \"","lastModifiedDate":"2020-07-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" + \"Existing remark will be overwritten by the input.\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2020-07-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" + \"r/ [REMARK]\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2020-07-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" + \"r/ Likes to swim.\";","lastModifiedDate":"2020-07-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_IMPLEMENTED_YET \u003d","lastModifiedDate":"2021-08-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"Remark command not implemented yet\";","lastModifiedDate":"2021-08-01"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET);","lastModifiedDate":"2020-07-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"## Enhancing `RemarkCommand`","lastModifiedDate":"2020-07-29"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` to parse input from the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"### Make the command accept parameters","lastModifiedDate":"2020-07-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"We start by modifying the constructor of `RemarkCommand` to accept an `Index` and a `String`. While we are at it, let’s change the error message to echo the values. While this is not a replacement for tests, it is an obvious way to tell if our code is functioning as intended.","lastModifiedDate":"2020-07-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2020-07-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ARGUMENTS \u003d \"Index: %1$d, Remark: %2$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":103,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":104,"author":{"gitId":"-"},"content":" private final String remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit the remark","lastModifiedDate":"2020-07-29"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @param remark of the person to be updated to","lastModifiedDate":"2020-07-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public RemarkCommand(Index index, String remark) {","lastModifiedDate":"2020-07-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":" requireAllNonNull(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":113,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2020-07-29"},{"lineNumber":114,"author":{"gitId":"-"},"content":" this.remark \u003d remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":" throw new CommandException(","lastModifiedDate":"2021-08-01"},{"lineNumber":119,"author":{"gitId":"-"},"content":" String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark));","lastModifiedDate":"2021-08-01"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":122,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":123,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2020-07-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2020-07-29"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2020-07-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2020-07-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":" if (!(other instanceof RemarkCommand)) {","lastModifiedDate":"2020-07-29"},{"lineNumber":130,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2020-07-29"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":" RemarkCommand e \u003d (RemarkCommand) other;","lastModifiedDate":"2020-07-29"},{"lineNumber":134,"author":{"gitId":"-"},"content":" return index.equals(e.index)","lastModifiedDate":"2020-07-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":" \u0026\u0026 remark.equals(e.remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":138,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Your code should look something like [this](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-a8e35af8f9c251525063fae36c9852922a7e7195763018eacec60f3a4d87c594) after you are done.","lastModifiedDate":"2022-01-02"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"### Parse user input","lastModifiedDate":"2020-07-29"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":144,"author":{"gitId":"-"},"content":"Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. The class must extend the `Parser` interface.","lastModifiedDate":"2020-07-29"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":148,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/add-remark/ParserClass.puml\" alt\u003d\"The relationship between Parser and RemarkCommandParser\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Thankfully, `ArgumentTokenizer#tokenize()` makes it trivial to parse user input. Let’s take a look at the JavaDoc provided for the function to understand what it does.","lastModifiedDate":"2020-07-29"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":152,"author":{"gitId":"-"},"content":"**`ArgumentTokenizer.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":154,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap}","lastModifiedDate":"2020-07-29"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * object that maps prefixes to their respective argument values. Only the","lastModifiedDate":"2020-07-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":" * given prefixes will be recognized in the arguments string.","lastModifiedDate":"2020-07-29"},{"lineNumber":159,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-07-29"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form:","lastModifiedDate":"2020-07-29"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2020-07-29"},{"lineNumber":162,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2020-07-29"},{"lineNumber":163,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their","lastModifiedDate":"2020-07-29"},{"lineNumber":164,"author":{"gitId":"-"},"content":" * arguments","lastModifiedDate":"2020-07-29"},{"lineNumber":165,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":166,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":168,"author":{"gitId":"-"},"content":"We can tell `ArgumentTokenizer#tokenize()` to look out for our new prefix `r/` and it will return us an instance of `ArgumentMultimap`. Now let’s find out what we need to do in order to obtain the Index and String that we need. Let’s look through `ArgumentMultimap` :","lastModifiedDate":"2020-07-29"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":170,"author":{"gitId":"-"},"content":"**`ArgumentMultimap.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":172,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":173,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2020-07-29"},{"lineNumber":175,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":"public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2020-07-29"},{"lineNumber":177,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2020-07-29"},{"lineNumber":178,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() :","lastModifiedDate":"2020-07-29"},{"lineNumber":179,"author":{"gitId":"-"},"content":" Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2020-07-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":181,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":183,"author":{"gitId":"-"},"content":"This appears to be what we need to get a String of the remark. But what about the Index? Let\u0027s take a quick peek at existing `Command` that uses an index to see how it is done.","lastModifiedDate":"2020-07-29"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":185,"author":{"gitId":"-"},"content":"**`DeleteCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":187,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":188,"author":{"gitId":"-"},"content":"Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":189,"author":{"gitId":"-"},"content":"return new DeleteCommand(index);","lastModifiedDate":"2020-07-29"},{"lineNumber":190,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":192,"author":{"gitId":"-"},"content":"There appears to be another utility class that obtains an `Index` from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Now that we have the know-how to extract the data that we need from the user’s input, we can parse the user command and create a new instance of `RemarkCommand`, as given below.","lastModifiedDate":"2020-07-29"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**`RemarkCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":198,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":199,"author":{"gitId":"-"},"content":"public RemarkCommand parse(String args) throws ParseException {","lastModifiedDate":"2020-07-29"},{"lineNumber":200,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":201,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(args,","lastModifiedDate":"2020-07-29"},{"lineNumber":202,"author":{"gitId":"-"},"content":" PREFIX_REMARK);","lastModifiedDate":"2020-07-29"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":204,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":205,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-07-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2020-07-29"},{"lineNumber":207,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2020-07-29"},{"lineNumber":208,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2020-07-29"},{"lineNumber":209,"author":{"gitId":"-"},"content":" RemarkCommand.MESSAGE_USAGE), ive);","lastModifiedDate":"2020-07-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":212,"author":{"gitId":"-"},"content":" String remark \u003d argMultimap.getValue(PREFIX_REMARK).orElse(\"\");","lastModifiedDate":"2020-07-29"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":214,"author":{"gitId":"-"},"content":" return new RemarkCommand(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":215,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":216,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":218,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":220,"author":{"gitId":"Fidget-Spinner"},"content":"Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`!","lastModifiedDate":"2024-02-25"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":222,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":224,"author":{"gitId":"-"},"content":"If you are stuck, check out the sample","lastModifiedDate":"2020-07-29"},{"lineNumber":225,"author":{"gitId":"-"},"content":"[here](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-8bf239e8e9529369b577701303ddd96af93178b4ed6735f91c2d8488b20c6b4a).","lastModifiedDate":"2022-01-02"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":227,"author":{"gitId":"-"},"content":"## Add `Remark` to the model","lastModifiedDate":"2020-07-29"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":229,"author":{"gitId":"-"},"content":"Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of person data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person’s name). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person.","lastModifiedDate":"2020-07-29"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":231,"author":{"gitId":"-"},"content":"### Add a new `Remark` class","lastModifiedDate":"2020-07-29"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":233,"author":{"gitId":"-"},"content":"Create a new `Remark` in `seedu.address.model.person`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code.","lastModifiedDate":"2020-07-29"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"A copy-paste and search-replace later, you should have something like [this](https://github.com/se-edu/addressbook-level3/commit/4516e099699baa9e2d51801bd26f016d812dedcc#diff-41bb13c581e280c686198251ad6cc337cd5e27032772f06ed9bf7f1440995ece). Note how `Remark` has no constrains and thus does not require input","lastModifiedDate":"2022-01-02"},{"lineNumber":236,"author":{"gitId":"-"},"content":"validation.","lastModifiedDate":"2020-07-29"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":238,"author":{"gitId":"-"},"content":"### Make use of `Remark`","lastModifiedDate":"2020-07-29"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":240,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. These should be relatively simple changes.","lastModifiedDate":"2020-07-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":242,"author":{"gitId":"-"},"content":"## Add a placeholder element for remark to the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":244,"author":{"gitId":"-"},"content":"Without getting too deep into `fxml`, let’s go on a 5 minute adventure to get some placeholder text to show up for each person.","lastModifiedDate":"2020-07-29"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":246,"author":{"gitId":"-"},"content":"Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688).","lastModifiedDate":"2022-01-02"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":248,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":250,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":251,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-07-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"private Label remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":253,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":256,"author":{"gitId":"-"},"content":"`@FXML` is an annotation that marks a private or protected field and makes it accessible to FXML. It might sound like Greek to you right now, don’t worry — we will get back to it later.","lastModifiedDate":"2020-07-29"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":258,"author":{"gitId":"-"},"content":"Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9).","lastModifiedDate":"2022-01-02"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"**`PersonListCard.fxml`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":262,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-07-29"},{"lineNumber":263,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"remark\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$remark\" /\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":264,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":266,"author":{"gitId":"-"},"content":"That’s it! Fire up the application again and you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"![$remark shows up in each entry](../images/add-remark/$Remark.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":270,"author":{"gitId":"-"},"content":"## Modify `Person` to support a `Remark` field","lastModifiedDate":"2020-07-29"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"Since `PersonCard` displays data from a `Person`, we need to update `Person` to get our `Remark` displayed!","lastModifiedDate":"2020-07-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### Modify `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":276,"author":{"gitId":"-"},"content":"We change the constructor of `Person` to take a `Remark`. We will also need to define new fields and accessors accordingly to store our new addition.","lastModifiedDate":"2020-07-29"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":278,"author":{"gitId":"-"},"content":"### Update other usages of `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":280,"author":{"gitId":"-"},"content":"Unfortunately, a change to `Person` will cause other commands to break, you will have to modify these commands to use the updated `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":282,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":284,"author":{"gitId":"Fidget-Spinner"},"content":"Use the `Find Usages` feature in IntelliJ IDEA on the `Person` class to find these commands.","lastModifiedDate":"2024-02-25"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":286,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Refer to [this commit](https://github.com/se-edu/addressbook-level3/commit/ce998c37e65b92d35c91d28c7822cd139c2c0a5c) and check that you have got everything in order!","lastModifiedDate":"2020-07-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":291,"author":{"gitId":"-"},"content":"## Updating Storage","lastModifiedDate":"2020-07-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":293,"author":{"gitId":"-"},"content":"AddressBook stores data by serializing `JsonAdaptedPerson` into `json` with the help of an external library — Jackson. Let’s update `JsonAdaptedPerson` to work with our new `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":295,"author":{"gitId":"-"},"content":"While the changes to code may be minimal, the test data will have to be updated as well.","lastModifiedDate":"2020-07-29"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":297,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":299,"author":{"gitId":"Fidget-Spinner"},"content":"You must delete AddressBook’s storage file located at `/data/addressbook.json` before running it! Not doing so will cause AddressBook to default to an empty address book!","lastModifiedDate":"2024-02-25"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":301,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"Check out [this commit](https://github.com/se-edu/addressbook-level3/commit/556cbd0e03ff224d7a68afba171ad2eb0ce56bbf)","lastModifiedDate":"2020-07-29"},{"lineNumber":304,"author":{"gitId":"-"},"content":"to see what the changes entail.","lastModifiedDate":"2020-07-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"## Finalizing the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":308,"author":{"gitId":"-"},"content":"Now that we have finalized the `Person` class and its dependencies, we can now bind the `Remark` field to the UI.","lastModifiedDate":"2020-07-29"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":310,"author":{"gitId":"-"},"content":"Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/commit/5b98fee11b6b3f5749b6b943c4f3bd3aa049b692)","lastModifiedDate":"2020-07-29"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":312,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":314,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":315,"author":{"gitId":"-"},"content":"public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2020-07-29"},{"lineNumber":316,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":317,"author":{"gitId":"-"},"content":" remark.setText(person.getRemark().value);","lastModifiedDate":"2020-07-29"},{"lineNumber":318,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":319,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":321,"author":{"gitId":"-"},"content":"![The remark label is bound properly!](../images/add-remark/RemarkBound.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":323,"author":{"gitId":"-"},"content":"## Putting everything together","lastModifiedDate":"2020-07-29"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":325,"author":{"gitId":"-"},"content":"After the previous step, we notice a peculiar regression — we went from displaying something to nothing at all. However, this is expected behavior as we are yet to update the `RemarkCommand` to make use of the code we\u0027ve been adding in the last few steps.","lastModifiedDate":"2020-07-29"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":327,"author":{"gitId":"-"},"content":"### Update `RemarkCommand` and `RemarkCommandParser`","lastModifiedDate":"2020-07-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":"In this last step, we modify `RemarkCommand#execute()` to change the `Remark` of a `Person`. Since all fields in a `Person` are immutable, we create a new instance of a `Person` with the values that we want and","lastModifiedDate":"2020-07-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"save it with `Model#setPerson()`.","lastModifiedDate":"2020-07-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-07-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ADD_REMARK_SUCCESS \u003d \"Added remark to Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_REMARK_SUCCESS \u003d \"Removed remark from Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":338,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":341,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2020-07-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2020-07-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2020-07-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-07-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new Person(","lastModifiedDate":"2021-08-01"},{"lineNumber":349,"author":{"gitId":"-"},"content":" personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),","lastModifiedDate":"2021-08-01"},{"lineNumber":350,"author":{"gitId":"-"},"content":" personToEdit.getAddress(), remark, personToEdit.getTags());","lastModifiedDate":"2020-07-29"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-07-29"},{"lineNumber":353,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-07-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":355,"author":{"gitId":"-"},"content":" return new CommandResult(generateSuccessMessage(editedPerson));","lastModifiedDate":"2020-07-29"},{"lineNumber":356,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":358,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":359,"author":{"gitId":"-"},"content":" * Generates a command execution success message based on whether","lastModifiedDate":"2021-08-01"},{"lineNumber":360,"author":{"gitId":"-"},"content":" * the remark is added to or removed from","lastModifiedDate":"2021-08-01"},{"lineNumber":361,"author":{"gitId":"-"},"content":" * {@code personToEdit}.","lastModifiedDate":"2020-07-29"},{"lineNumber":362,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":363,"author":{"gitId":"-"},"content":" private String generateSuccessMessage(Person personToEdit) {","lastModifiedDate":"2020-07-29"},{"lineNumber":364,"author":{"gitId":"-"},"content":" String message \u003d !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;","lastModifiedDate":"2020-07-29"},{"lineNumber":365,"author":{"gitId":"-"},"content":" return String.format(message, personToEdit);","lastModifiedDate":"2020-07-29"},{"lineNumber":366,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":367,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":369,"author":{"gitId":"-"},"content":"![Congratulations!](../images/add-remark/RemarkComplete.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":371,"author":{"gitId":"-"},"content":"## Writing tests","lastModifiedDate":"2020-07-29"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":373,"author":{"gitId":"-"},"content":"Tests are crucial to ensuring that bugs don’t slip into the codebase unnoticed. This is especially true for large code bases where a change might lead to unintended behavior.","lastModifiedDate":"2020-07-29"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":375,"author":{"gitId":"-"},"content":"Let’s verify the correctness of our code by writing some tests!","lastModifiedDate":"2020-07-29"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":377,"author":{"gitId":"-"},"content":"Of course you can simply add the test cases manually, like you\u0027ve been doing all along this tutorial. The result would be like the test cases in [here](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01). Alternatively, you can get the help of IntelliJ to generate the skeletons of the test cases, as explained in the next section.","lastModifiedDate":"2022-01-02"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":379,"author":{"gitId":"-"},"content":"### Automatically generating tests","lastModifiedDate":"2020-07-29"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":381,"author":{"gitId":"-"},"content":"The goal is to write effective and efficient tests to ensure that `RemarkCommand#execute()` behaves as expected.","lastModifiedDate":"2020-07-29"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":383,"author":{"gitId":"-"},"content":"The convention for test names is `methodName_testScenario_expectedResult`. An example would be","lastModifiedDate":"2020-07-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"`execute_filteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"Let’s create a test for `RemarkCommand#execute()` to test that adding a remark works. On `IntelliJ IDEA` you can bring up the context menu and choose to `Go To` \\\u003e `Test` or use the appropriate keyboard shortcut.","lastModifiedDate":"2020-07-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":388,"author":{"gitId":"-"},"content":"![Using the context menu to jump to tests](../images/add-remark/ContextMenu.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":390,"author":{"gitId":"-"},"content":"Then, create a test for the `execute` method.","lastModifiedDate":"2020-07-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":392,"author":{"gitId":"-"},"content":"![Creating a test for `execute`.](../images/add-remark/CreateTest.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":394,"author":{"gitId":"-"},"content":"Following convention, let’s change the name of the generated method to `execute_addRemarkUnfilteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":396,"author":{"gitId":"-"},"content":"Let’s use the utility functions provided in `CommandTestUtil`. The functions ensure that commands produce the expected `CommandResult` and output the correct message. In this case, `CommandTestUtil#assertCommandSuccess` is the best fit as we are testing that a `RemarkCommand` will successfully add a `Remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"You should end up with a test that looks something like [this](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49).","lastModifiedDate":"2022-01-02"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":400,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-07-29"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":402,"author":{"gitId":"-"},"content":"This concludes the tutorial for adding a new `Command` to AddressBook.","lastModifiedDate":"2020-07-29"}],"authorContributionMap":{"-":387,"Fidget-Spinner":15}},{"path":"docs/tutorials/RemovingFields.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Tutorial: Removing Fields\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Tutorial: Removing Fields","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003e Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003e — Antoine de Saint-Exupery","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"When working on an existing code base, you will most likely find that some features that are no longer necessary.","lastModifiedDate":"2021-08-01"},{"lineNumber":14,"author":{"gitId":"-"},"content":"This tutorial aims to give you some practice on such a code \u0027removal\u0027 activity by removing the `address` field from `Person` class.","lastModifiedDate":"2021-08-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"success\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"**If you have done the [Add `remark` command tutorial](AddRemark.html) already**, you should know where the code had to be updated to add the field `remark`. From that experience, you can deduce where the code needs to be changed to _remove_ that field too. The removing of the `address` field can be done similarly.","lastModifiedDate":"2021-08-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"However, if you have no such prior knowledge, removing a field can take a quite a bit of detective work. This tutorial takes you through that process. **At least have a read even if you don\u0027t actually do the steps yourself.**","lastModifiedDate":"2021-08-01"},{"lineNumber":22,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- {:toc} --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"## Safely deleting `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"IntelliJ IDEA provides a refactoring tool that can identify *most* parts of a removal easily. Let’s try to use it as much as we can.","lastModifiedDate":"2021-08-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"### Assisted refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"The `address` field in `Person` is actually an instance of the `seedu.address.model.person.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`\u0027s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \\\u003e `Safe Delete` through the menu.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* :bulb: To make things simpler, you can unselect the options `Search in comments and strings` and `Search for text occurrences`","lastModifiedDate":"2021-08-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"![Usages detected](../images/remove/UnsafeDelete.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"Choose to `View Usages` and you should be presented with a list of `Safe Delete Conflicts`. These conflicts describe locations in which the `Address` class is used.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"![List of conflicts](../images/remove/SafeDeleteConflicts.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"Remove usages of `Address` by performing `Safe Delete`s on each entry i.e., double-click on the entry (which takes you to the code in concern, right-click on that entity, and choose `Refactor` -\u003e `Safe delete` as before). You will need to exercise discretion when removing usages of `Address`. Functions like `ParserUtil#parseAddress()` can be safely removed but its usages must be removed as well. Other usages like in `EditPersonDescriptor` may require more careful inspection.","lastModifiedDate":"2021-08-01"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"Let’s try removing references to `Address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"1. Safe delete the field `address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"1. Select `Yes` when prompted to remove getters and setters.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"1. Select `View Usages` again.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" ![UnsafeDeleteOnField](../images/remove/UnsafeDeleteOnField.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"1. Remove the usages of `address` and select `Do refactor` when you are done.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"Fidget-Spinner"},"content":" **Tip:** Removing usages may result in errors. Exercise discretion and fix them. For example, removing the `address` field from the `Person` class will require you to modify its constructor.","lastModifiedDate":"2024-02-25"},{"lineNumber":59,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"1. Repeat the steps for the remaining usages of `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"After you are done, verify that the application still works by compiling and running it again.","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"### Manual refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"Unfortunately, there are usages of `Address` that IntelliJ IDEA cannot identify. You can find them by searching for instances of the word `address` in your code (`Edit` \\\u003e `Find` \\\u003e `Find in path`).","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"Places of interest to look out for would be resources used by the application. `main/resources` contains images and `fxml` files used by the application and `test/resources` contains test data. For example, there is a `$address` in each `PersonCard` that has not been removed nor identified.","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"![$address](../images/remove/$address.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"A quick look at the `PersonCard` class and its `fxml` file quickly reveals why it slipped past the automated refactoring.","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"**`PersonCard.java`**","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"private Label address;","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"...","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":"**`PersonCard.fxml`**","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"After removing the `Label`, we can proceed to formally test our code. If everything went well, you should have most of your tests pass. Fix any remaining errors until the tests all pass.","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"## Tidying up","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"At this point, your application is working as intended and all your tests are passing. What’s left to do is to clean up references to `Address` in test data and documentation.","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"In `src/test/data/`, data meant for testing purposes are stored. While keeping the `address` field in the json files does not cause the tests to fail, it is not good practice to let cruft from old features accumulate.","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"**`invalidPersonAddressBook.json`:**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"```json","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"{","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \"persons\": [ {","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \"name\": \"Person with invalid name field: Ha!ns Mu@ster\",","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \"phone\": \"9482424\",","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \"email\": \"hans@example.com\",","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":" \"address\": \"4th street\"","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"You can go through each individual `json` file and manually remove the `address` field.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":104,"Fidget-Spinner":11}},{"path":"docs/tutorials/TracingCode.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"Fidget-Spinner"},"content":" layout: default.md","lastModifiedDate":"2024-02-25"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Tutorial: Tracing code\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Fidget-Spinner"},"content":" pageNav: 3","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"Fidget-Spinner"},"content":"# Tutorial: Tracing code","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003e Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code. …​\\[Therefore,\\] making it easy to read makes it easier to write.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003e — Robert C. Martin Clean Code: A Handbook of Agile Software Craftsmanship","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"When trying to understand an unfamiliar code base, one common strategy used is to trace some representative execution path through the code base. One easy way to trace an execution path is to use a debugger to step through the code. In this tutorial, you will be using the IntelliJ IDEA’s debugger to trace the execution path of a specific user command.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c!-- {:toc} --\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"## Before we start","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"Before we jump into the code, it is useful to get an idea of the overall structure and the high-level behavior of the application. This is provided in the \u0027Architecture\u0027 section of the developer guide. In particular, the architecture diagram (reproduced below), tells us that the App consists of several components.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ArchitectureDiagram.puml\" alt\u003d\"ArchitectureDiagram\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"It also has a sequence diagram (reproduced below) that tells us how a command propagates through the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"Note how the diagram shows only the execution flows _between_ the main components. That is, it does not show details of the execution path *inside* each component. By hiding those details, the diagram aims to inform the reader about the overall execution path of a command without overwhelming the reader with too much details. In this tutorial, you aim to find those omitted details so that you get a more in-depth understanding of how the code works.","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"Before we proceed, ensure that you have done the following:","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"1. Read the [*Architecture* section of the DG](../DeveloperGuide.md#architecture)","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. Set up the project in Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"1. Learn basic debugging features of Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * If you are using a different IDE, we\u0027ll leave it to you to figure out the equivalent feature to use in your IDE.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * If you are not using an IDE, we\u0027ll let you figure out how to achieve the same using your coding toolchain.","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"## Setting a breakpoint","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"As you know, the first step of debugging is to put in a breakpoint where you want the debugger to pause the execution. For example, if you are trying to understand how the App starts up, you would put a breakpoint in the first statement of the `main` method.","lastModifiedDate":"2021-07-31"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"In our case, we would want to begin the tracing at the very point where the App start processing user input (i.e., somewhere in the UI component), and then trace through how the execution proceeds through the UI component. However, the execution path through a GUI is often somewhat obscure due to various *event-driven mechanisms* used by GUI frameworks, which happens to be the case here too. Therefore, let us put the breakpoint where the `UI` transfers control to the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":46,"author":{"gitId":"-"},"content":"According to the sequence diagram you saw earlier (and repeated above for reference), the `UI` component yields control to the `Logic` component through a method named `execute`. Searching through the code base for an `execute()` method that belongs to the `Logic` component yields a promising candidate in `seedu.address.logic.Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/tracing/searchResultsForExecuteMethod.png\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":50,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":52,"author":{"gitId":"Fidget-Spinner"},"content":"**Intellij Tip:** The [\u0027**Search Everywhere**\u0027 feature](https://www.jetbrains.com/help/idea/searching-everywhere.html) can be used here. In particular, the \u0027**Find Symbol**\u0027 (\u0027Symbol\u0027 here refers to methods, variables, classes etc.) variant of that feature is quite useful here as we are looking for a _method_ named `execute`, not simply the text `execute`.","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":"A quick look at the `seedu.address.logic.Logic` (an extract given below) confirms that this indeed might be what we’re looking for.","lastModifiedDate":"2021-07-31"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":57,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"But apparently, this is an interface, not a concrete implementation.","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"That should be fine because the [Architecture section of the Developer Guide](../DeveloperGuide.html#architecture) tells us that components interact through interfaces. Here\u0027s the relevant diagram:","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cpuml src\u003d\"../diagrams/ComponentManagers.puml\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"Next, let\u0027s find out which statement(s) in the `UI` code is calling this method, thus transferring control from the `UI` to the `Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":80,"author":{"gitId":"Fidget-Spinner"},"content":"**Intellij Tip:** The [\u0027**Find Usages**\u0027 feature](https://www.jetbrains.com/help/idea/find-highlight-usages.html#find-usages) can find from which parts of the code a class/method/variable is being used.","lastModifiedDate":"2024-02-25"},{"lineNumber":81,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"![`Find Usages` tool window. `Edit` \\\u003e `Find` \\\u003e `Find Usages`.](../images/tracing/FindUsages.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Bingo\\! `MainWindow#executeCommand()` seems to be exactly what we’re looking for\\!","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Now let’s set the breakpoint. First, double-click the item to reach the corresponding code. Once there, click on the left gutter to set a breakpoint, as shown below.","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" ![LeftGutter](../images/tracing/LeftGutter.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"## Tracing the execution path","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"Recall from the User Guide that the `edit` command has the format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` For this tutorial we will be issuing the command `edit 1 n/Alice Yeoh`.","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"Fidget-Spinner"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"Fidget-Spinner"},"content":"**Tip:** Over the course of the debugging session, you will encounter every major component in the application. Try to keep track of what happens inside the component and where the execution transfers to another component.","lastModifiedDate":"2024-02-25"},{"lineNumber":97,"author":{"gitId":"Fidget-Spinner"},"content":"\u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"1. To start the debugging session, simply `Run` \\\u003e `Debug Main`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"1. When the GUI appears, enter `edit 1 n/Alice Yeoh` into the command box and press `Enter`.","lastModifiedDate":"2021-07-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"1. The Debugger tool window should show up and show something like this:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":" ![DebuggerStep1](../images/tracing/DebuggerStep1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. Use the _Show execution point_ feature to jump to the line of code that we stopped at:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" ![ShowExecutionPoint](../images/tracing/ShowExecutionPoint.png)\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":108,"author":{"gitId":"-"},"content":" `CommandResult commandResult \u003d logic.execute(commandText);` is the line that you end up at (i.e., the place where we put the breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"1. We are interested in the `logic.execute(commandText)` portion of that line so let’s _Step in_ into that method call:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":" ![StepInto](../images/tracing/StepInto.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"1. We end up in `LogicManager#execute()` (not `Logic#execute` -- but this is expected because we know the `execute()` method in the `Logic` interface is actually implemented by the `LogicManager` class). Let’s take a look at the body of the method. Given below is the same code, with additional explanatory comments.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" **LogicManager\\#execute().**","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" throws CommandException, ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" //Logging, safe to ignore","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" //Parse user input from String to a Command","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" //Executes the Command and stores the result","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" //We can deduce that the previous line of code modifies model in some way","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" // since it\u0027s being stored here.","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" throw new CommandException(FILE_OPS_ERROR_MESSAGE + ioe, ioe);","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"1. `LogicManager#execute()` appears to delegate most of the heavy lifting to other components. Let’s take a closer look at each one.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"1. _Step over_ the logging code since it is of no interest to us now.","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":" ![StepOver](../images/tracing/StepOver.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"1. _Step into_ the line where user input in parsed from a String to a Command, which should bring you to the `AddressBookParser#parseCommand()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","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":"1. _Step over_ the statements in that method until you reach the `switch` statement. The \u0027Variables\u0027 window now shows the value of both `commandWord` and `arguments`:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":158,"author":{"gitId":"-"},"content":" ![Variables](../images/tracing/Variables.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"1. We see that the value of `commandWord` is now `edit` but `arguments` is still not processed in any meaningful way.","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"1. Stepping through the `switch` block, we end up at a call to `EditCommandParser().parse()` as expected (because the command we typed is an edit command).","lastModifiedDate":"2021-07-31"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"1. Let’s see what `EditCommandParser#parse()` does by stepping into it. You might have to click the \u0027step into\u0027 button multiple times here because there are two method calls in that statement: `EditCommandParser()` and `parse()`.","lastModifiedDate":"2021-07-31"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":174,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":175,"author":{"gitId":"Fidget-Spinner"},"content":" **Intellij Tip:** Sometimes, you might end up stepping into functions that are not of interest. Simply use the `step out` button to get out of them!","lastModifiedDate":"2024-02-25"},{"lineNumber":176,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"1. Stepping through the method shows that it calls `ArgumentTokenizer#tokenize()` and `ParserUtil#parseIndex()` to obtain the arguments and index required.","lastModifiedDate":"2021-07-31"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"1. The rest of the method seems to exhaustively check for the existence of each possible parameter of the `edit` command and store any possible changes in an `EditPersonDescriptor`. Recall that we can verify the contents of `editPersonDesciptor` through the \u0027Variables\u0027 window.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":181,"author":{"gitId":"-"},"content":" ![EditCommand](../images/tracing/EditCommand.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"1. As you just traced through some code involved in parsing a command, you can take a look at this class diagram to see where the various parsing-related classes you encountered fit into the design of the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":184,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":186,"author":{"gitId":"-"},"content":"1. Let’s continue stepping through until we return to `LogicManager#execute()`.","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" The sequence diagram below shows the details of the execution path through the Logic component. Does the execution path you traced in the code so far match the diagram?\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":189,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/tracing/LogicSequenceDiagram.puml\" alt\u003d\"Tracing an `edit` command through the Logic component\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"1. Now, step over until you read the statement that calls the `execute()` method of the `EditCommand` object received, and step into that `execute()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":" **`EditCommand#execute()`:**","lastModifiedDate":"2021-07-31"},{"lineNumber":194,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, editedPerson));","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"1. As suspected, `command#execute()` does indeed make changes to the `model` object. Specifically,","lastModifiedDate":"2021-07-31"},{"lineNumber":210,"author":{"gitId":"-"},"content":" * it uses the `setPerson()` method (defined in the interface `Model` and implemented in `ModelManager` as per the usual pattern) to update the person data.","lastModifiedDate":"2021-07-31"},{"lineNumber":211,"author":{"gitId":"-"},"content":" * it uses the `updateFilteredPersonList` method to ask the `Model` to populate the \u0027filtered list\u0027 with _all_ persons.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":212,"author":{"gitId":"-"},"content":" FYI, The \u0027filtered list\u0027 is the list of persons resulting from the most recent operation that will be shown to the user immediately after. For the `edit` command, we populate it with all the persons so that the user can see the edited person along with all other persons. If this was a `find` command, we would be setting that list to contain the search results instead.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":213,"author":{"gitId":"-"},"content":" To provide some context, given below is the class diagram of the `Model` component. See if you can figure out where the \u0027filtered list\u0027 of persons is being tracked.","lastModifiedDate":"2021-07-31"},{"lineNumber":214,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e\u003cbr\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":215,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Model` component section of the DG](../DeveloperGuide.html#model-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"1. As you step through the rest of the statements in the `EditCommand#execute()` method, you\u0027ll see that it creates a `CommandResult` object (containing information about the result of the execution) and returns it.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":218,"author":{"gitId":"-"},"content":" Advancing the debugger by one more step should take you back to the middle of the `LogicManager#execute()` method.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"1. Given that you have already seen quite a few classes in the `Logic` component in action, see if you can identify in this partial class diagram some of the classes you\u0027ve encountered so far, and see how they fit into the class structure of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":221,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":222,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":223,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Logic` component section of the DG](../DeveloperGuide.html#logic-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"1. Similar to before, you can step over/into statements in the `LogicManager#execute()` method to examine how the control is transferred to the `Storage` component and what happens inside that component.","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":228,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"Fidget-Spinner"},"content":" **Intellij Tip:** When trying to step into a statement such as `storage.saveAddressBook(model.getAddressBook())` which contains multiple method calls, Intellij will let you choose (by clicking) which one you want to step into.","lastModifiedDate":"2024-02-25"},{"lineNumber":230,"author":{"gitId":"Fidget-Spinner"},"content":" \u003c/box\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"1. As you step through the code inside the `Storage` component, you will eventually arrive at the `JsonAddressBook#saveAddressBook()` method which calls the `JsonSerializableAddressBook` constructor, to create an object that can be _serialized_ (i.e., stored in storage medium) in JSON format. That constructor is given below (with added line breaks for easier readability):","lastModifiedDate":"2021-07-31"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":234,"author":{"gitId":"-"},"content":" **`JsonSerializableAddressBook` constructor:**","lastModifiedDate":"2021-07-31"},{"lineNumber":235,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" * {@code JsonSerializableAddressBook}.","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":" persons.addAll(","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" source.getPersonList()","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .stream()","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" .map(JsonAdaptedPerson::new)","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"1. It appears that a `JsonAdaptedPerson` is created for each `Person` and then added to the `JsonSerializableAddressBook`.","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" This is because regular Java objects need to go through an _adaptation_ for them to be suitable to be saved in JSON format.","lastModifiedDate":"2021-07-31"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"1. While you are stepping through the classes in the `Storage` component, here is the component\u0027s class diagram to help you understand how those classes fit into the structure of the component.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":255,"author":{"gitId":"Fidget-Spinner"},"content":" \u003cpuml src\u003d\"../diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":256,"author":{"gitId":"Fidget-Spinner"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":257,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Storage` component section of the DG](../DeveloperGuide.html#storage-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"1. We can continue to step through until you reach the end of the `LogicManager#execute()` method and return to the `MainWindow#executeCommand()` method (the place where we put the original breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"1. Stepping into `resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());`, we end up in:","lastModifiedDate":"2021-07-31"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" **`ResultDisplay#setFeedbackToUser()`**","lastModifiedDate":"2021-07-31"},{"lineNumber":264,"author":{"gitId":"-"},"content":" ```java","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"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":"1. Finally, you can step through until you reach the end of`MainWindow#executeCommand()`.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":272,"author":{"gitId":"-"},"content":" :bulb: This may be a good time to read through the [`UI` component section of the DG](../DeveloperGuide.html#ui-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"In this tutorial, we traced a valid edit command from raw user input to the result being displayed to the user. From this tutorial, you learned more about how the various components work together to produce a response to a user command.","lastModifiedDate":"2021-07-31"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"Here are some quick questions you can try to answer based on your execution path tracing. In some cases, you can do further tracing for the given commands to find exactly what happens.","lastModifiedDate":"2021-07-31"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"1. In this tutorial, we traced the \"happy path\" (i.e., no errors). What","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" do you think will happen if we traced the following commands","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":" instead? What exceptions do you think will be thrown (if any), where","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":" will the exceptions be thrown and where will they be handled?","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":" 1. `redit 1 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":" 2. `edit 0 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":" 3. `edit 1 n/Alex Yeoh`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":" 4. `edit 1`","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":" 5. `edit 1 n/アリス ユー`","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":" 6. `edit 1 t/one t/two t/three t/one`","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"2. What components will you have to modify to perform the following","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":" enhancements to the application?","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":" 1. Make command words case-insensitive","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":" 2. Allow `delete` to remove more than one index at a time","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":" 3. Save the address book in the CSV format instead","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":" 4. Add a new command","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":" 5. Add a new field to `Person`","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":" 6. Add a new entity to the address book","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":276,"Fidget-Spinner":35}}] diff --git a/AY2324S2-CS2103T-W11-2_tp_master/commits.json b/AY2324S2-CS2103T-W11-2_tp_master/commits.json index b4983661..8be45ae3 100644 --- a/AY2324S2-CS2103T-W11-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-W11-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"JuliaPoo":[{"date":"2024-03-03","commitResults":[{"hash":"929e75f1a864428141dc8315d6e6818e344dd1cb","isMergeCommit":false,"messageTitle":"Updated AboutUs.md and added portfolios for each member (#15)","messageBody":"* Docs: Updated AboutUs.md\r\n\r\nUpdated according to https://nus-cs2103-ay2324s2.github.io/website/schedule/week7/project.html\r\nIt is not completed, we require other members to add their profile pictures.\r\n\r\n* Update AboutUs.md","fileTypesAndContributionMap":{"docs":{"insertions":80,"deletions":23}}}]}],"chuahjiajie":[],"alphajae11":[{"date":"2024-03-04","commitResults":[{"hash":"78165e32e484b6fe123719efe72ab877688d848d","isMergeCommit":false,"messageTitle":"Add Use Cases, Target user profile, value proposition, and user stories documentation (#14)","messageBody":"* Accomplish 2 tasks given regarding Developer Guide\r\n\r\n* Fixed minor typo\r\n\r\nRealised you\u0027ve enabled others to edit so yay\r\n\r\n* Docs: Formatting\r\n\r\n1. Standardised `EXCO Member` by replacing references to `CCA Organiser` with `EXCO Member`\r\n2. Replaced Use Case documentation with verbatim code blocks so that it looks somewhat nicer in markbind\r\n3. Backticked glossary terms\r\n\r\n---------\r\n\r\nCo-authored-by: alphajae11 \u003cleejaegeun20#gmail.com\u003e\r\nCo-authored-by: Jules \u003c57632293+JuliaPoo@users.noreply.github.com\u003e\r\nCo-authored-by: Jules \u003cjulia.poo.poo.poo@gmail.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":70,"deletions":21}}}]}],"LifHoshi":[{"date":"2024-03-02","commitResults":[{"hash":"1213e981f70f26c45c5bed5b02fbc628e3ed12a2","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":101,"deletions":64}}},{"hash":"0a224865b7ab76ed2483f285223f63ea4fcdd6b0","isMergeCommit":true,"messageTitle":"Merge pull request #1 from LifHoshi/branch-UserGuide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"9b05cc46a6c47ca893294f9651edb5c8c45004bd","isMergeCommit":true,"messageTitle":"Merge pull request #13 from LifHoshi/master","messageBody":"Update User Guide And Upload Photo","fileTypesAndContributionMap":{}}]}],"Fidget-Spinner":[{"date":"2024-02-25","commitResults":[{"hash":"528aca17076c7442fdb249e5ae1fdbed7bda7154","isMergeCommit":false,"messageTitle":"Use MarkBind instead of Jekyll for project website","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":170,"deletions":0},"docs":{"insertions":311,"deletions":190}}},{"hash":"970018e28966596eb65633fd658a0b8fb7290a27","isMergeCommit":false,"messageTitle":"Rename AB3 to CCA Manager in docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"JuliaPoo":{"docs":80,"functional-code":0,"test-code":0},"chuahjiajie":{"docs":0,"functional-code":0,"test-code":0},"alphajae11":{"docs":65,"functional-code":0,"test-code":0},"LifHoshi":{"docs":96,"functional-code":0,"test-code":0},"Fidget-Spinner":{"docs":265,"functional-code":0,"test-code":0,"other":170}},"authorContributionVariance":{"JuliaPoo":876.7769,"chuahjiajie":0.0,"alphajae11":684.3801,"LifHoshi":2250.0,"Fidget-Spinner":37432.152},"authorDisplayNameMap":{"JuliaPoo":"CS2103T-W11-2 POON..LIAN","chuahjiajie":"CS2103T-W11-2 CHUA.. JIE","alphajae11":"CS2103T-W11-2 LEE ..GEUN","LifHoshi":"CS2103T-W11-2 WANG..LIFU","Fidget-Spinner":"CS2103T-W11-2 OOI .. JIN"}} +{"authorDailyContributionsMap":{"JuliaPoo":[{"date":"2024-03-03","commitResults":[{"hash":"929e75f1a864428141dc8315d6e6818e344dd1cb","isMergeCommit":false,"messageTitle":"Updated AboutUs.md and added portfolios for each member (#15)","messageBody":"* Docs: Updated AboutUs.md\r\n\r\nUpdated according to https://nus-cs2103-ay2324s2.github.io/website/schedule/week7/project.html\r\nIt is not completed, we require other members to add their profile pictures.\r\n\r\n* Update AboutUs.md","fileTypesAndContributionMap":{"docs":{"insertions":80,"deletions":23}}}]}],"chuahjiajie":[],"alphajae11":[{"date":"2024-03-04","commitResults":[{"hash":"78165e32e484b6fe123719efe72ab877688d848d","isMergeCommit":false,"messageTitle":"Add Use Cases, Target user profile, value proposition, and user stories documentation (#14)","messageBody":"* Accomplish 2 tasks given regarding Developer Guide\r\n\r\n* Fixed minor typo\r\n\r\nRealised you\u0027ve enabled others to edit so yay\r\n\r\n* Docs: Formatting\r\n\r\n1. Standardised `EXCO Member` by replacing references to `CCA Organiser` with `EXCO Member`\r\n2. Replaced Use Case documentation with verbatim code blocks so that it looks somewhat nicer in markbind\r\n3. Backticked glossary terms\r\n\r\n---------\r\n\r\nCo-authored-by: alphajae11 \u003cleejaegeun20#gmail.com\u003e\r\nCo-authored-by: Jules \u003c57632293+JuliaPoo@users.noreply.github.com\u003e\r\nCo-authored-by: Jules \u003cjulia.poo.poo.poo@gmail.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":70,"deletions":21}}}]}],"LifHoshi":[{"date":"2024-03-02","commitResults":[{"hash":"1213e981f70f26c45c5bed5b02fbc628e3ed12a2","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":101,"deletions":64}}},{"hash":"0a224865b7ab76ed2483f285223f63ea4fcdd6b0","isMergeCommit":true,"messageTitle":"Merge pull request #1 from LifHoshi/branch-UserGuide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"9b05cc46a6c47ca893294f9651edb5c8c45004bd","isMergeCommit":true,"messageTitle":"Merge pull request #13 from LifHoshi/master","messageBody":"Update User Guide And Upload Photo","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"0cd417f2e96639b4797916ef0fa57c165d224375","isMergeCommit":false,"messageTitle":"Update small change on UserGuide.md to meet with tp Dashboard (#24)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"Fidget-Spinner":[{"date":"2024-02-25","commitResults":[{"hash":"528aca17076c7442fdb249e5ae1fdbed7bda7154","isMergeCommit":false,"messageTitle":"Use MarkBind instead of Jekyll for project website","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":170,"deletions":0},"docs":{"insertions":311,"deletions":190}}},{"hash":"970018e28966596eb65633fd658a0b8fb7290a27","isMergeCommit":false,"messageTitle":"Rename AB3 to CCA Manager in docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"JuliaPoo":{"docs":80,"functional-code":0,"test-code":0},"chuahjiajie":{"docs":0,"functional-code":0,"test-code":0},"alphajae11":{"docs":65,"functional-code":0,"test-code":0},"LifHoshi":{"docs":96,"functional-code":0,"test-code":0},"Fidget-Spinner":{"docs":265,"functional-code":0,"test-code":0,"other":170}},"authorContributionVariance":{"JuliaPoo":753.30176,"chuahjiajie":0.0,"alphajae11":588.0,"LifHoshi":1929.5145,"Fidget-Spinner":32160.646},"authorDisplayNameMap":{"JuliaPoo":"CS2103T-W11-2 POON..LIAN","chuahjiajie":"CS2103T-W11-2 CHUA.. JIE","alphajae11":"CS2103T-W11-2 LEE ..GEUN","LifHoshi":"CS2103T-W11-2 WANG..LIFU","Fidget-Spinner":"CS2103T-W11-2 OOI .. JIN"}} diff --git a/AY2324S2-CS2103T-W12-1_tp_master/authorship.json b/AY2324S2-CS2103T-W12-1_tp_master/authorship.json index 2905462d..ac625f92 100644 --- a/AY2324S2-CS2103T-W12-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W12-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: 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":"getsquared"},"content":"### Ge Shuqing","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":"\u003cimg src\u003d\"images/getsquared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"getsquared"},"content":"[[github](http://github.com/getsquared)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"[[portfolio](team/shuqing.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":"* Role: Integration + Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":"* Role: Project Advisor","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"### Regan Choy","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":"\u003cimg src\u003d\"images/reganchoy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"content":"[[github](http://github.com/ReganChoy)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"ReganChoy"},"content":"[[portfolio](team/reganchoy.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":"* Role: Deliverables + Deadline + Scheduling","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":"* Responsibilities: Model","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"solomonng2001"},"content":"### Solomon Ng","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"solomonng2001"},"content":"\u003cimg src\u003d\"images/solomonng2001.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"solomonng2001"},"content":"[[github](http://github.com/solomonng2001)] [[portfolio](team/solomonng.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"solomonng2001"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"solomonng2001"},"content":"* Responsibilities: Storage","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"yorklim"},"content":"### Chia York Lim","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"yorklim"},"content":"\u003cimg src\u003d\"images/yorklim.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"yorklim"},"content":"[[github](http://github.com/yorklim)]","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"yorklim"},"content":"[[portfolio](team/yorklim.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"yorklim"},"content":"* Role: Team lead + Code quality","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"yorklim"},"content":"* Responsibilities: Dev Ops","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"getsquared":5,"ReganChoy":7,"solomonng2001":5,"yorklim":6,"-":50}},{"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":"getsquared"},"content":"* has a need to manage a significant number of clients for insurance policies","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"getsquared"},"content":"* has a need to organise schedules with clients and their details in one place","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"getsquared"},"content":"* has a need for reminders to keep in touch with clients","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"getsquared"},"content":"**Value proposition**: conveniently manage client details and schedules faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"yorklim"},"content":"|----------|-----------------|-------------------------------------------------------|-----------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | add a new client contact details | keep track of the clients I have |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | delete a client | remove clients that are leaving |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | find a client by name | locate details of client without having to go through the entire list |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | view client information | know and check client details |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"ReganChoy"},"content":"| `* *` | insurance agent | check schedules with clients on a date | keep track of what I have to do in a day |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | add the birthday of my clients | wish them happy birthday to keep in contact with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | delete policy details for a client | remove expired policies of the client |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | see when I last met a client | check in on a client that I have not met for a long time |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | mark that a schedule is completed | know that i fulfilled the appointment scheduled |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"ReganChoy"},"content":"| `* *` | insurance agent | add policy details of a client | keep track of clients and their policies |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"ReganChoy"},"content":"| `* *` | insurance agent | schedule checkup date and time for clients | so I know when to follow-up with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"getsquared"},"content":"| `*` | insurance agent | sort clients by priority | deal with client with higher priority status first |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | track deals that I have closed | track my current progress |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | edit my client\u0027s details | update my client\u0027s details |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | reschedule my appointments | change the date and time of appointments with clients |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | filter clients by importance | decide on who to prioritise on |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | get help | use the app when I am lost or confused |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"yorklim"},"content":"| `*` | insurance agent | can sort clients by the expected revenue of the deals | know which clients to prioritise |","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"yorklim"},"content":"| `*` | insurance agent | set the policy payment due dates | remind my clients. |","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"yorklim"},"content":"| `*` | insurance agent | add the maturity date of my client’s policy | update them and plan for future policies |","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"yorklim"},"content":"| `*` | developer | view list of all bugs reported by users | conveniently view all reported bugs and fix them |","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"yorklim"},"content":"| `*` | colleague | import someone\u0027s contact list | take over his clients |","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"yorklim"},"content":"| `*` | insurance agent | report issues/bugs | get someone to fix bugs |","lastModifiedDate":"2024-03-06"},{"lineNumber":318,"author":{"gitId":"yorklim"},"content":"| `*` | developer\t | get a log list of user activity | view user activity to bug fix |","lastModifiedDate":"2024-03-06"},{"lineNumber":319,"author":{"gitId":"yorklim"},"content":"| `*` | manager | view all my subordinates\u0027 clients | be aware of their progress and client base |","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"yorklim"},"content":"| `*` | insurance agent | get reminders of client birthday | send birthday message |","lastModifiedDate":"2024-03-06"},{"lineNumber":321,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"getsquared"},"content":"(For all use cases below, the **System** is the `ClientCare` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"getsquared"},"content":"**Use case: Find a client by name**","lastModifiedDate":"2024-03-05"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"getsquared"},"content":"1. User requests to find a specific client in the list by name","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"getsquared"},"content":"2. ClientCare shows list of client that matches the name","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"getsquared"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"getsquared"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"getsquared"},"content":"* 2a. The list is empty as there is no matching name found.","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"getsquared"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"getsquared"},"content":"**Use case: Delete a client**","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"getsquared"},"content":"1. User requests to list clients or find client by name","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"getsquared"},"content":"2. ClientCare shows a list of clients","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"getsquared"},"content":"3. User requests to delete a specific client in the list by index","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"getsquared"},"content":"4. ClientCare deletes the client","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"getsquared"},"content":" * 3a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"ReganChoy"},"content":"**Use case: Schedule**","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"ReganChoy"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"ReganChoy"},"content":"1. User schedules a date and time to meet with a client","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"ReganChoy"},"content":"2. ClientCare sets up the appointment","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":376,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":377,"author":{"gitId":"ReganChoy"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"ReganChoy"},"content":"* 1a. Date and time is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":381,"author":{"gitId":"ReganChoy"},"content":" * 1a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":383,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"ReganChoy"},"content":"* 1b. Date and time has past.","lastModifiedDate":"2024-03-05"},{"lineNumber":386,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"ReganChoy"},"content":" * 1b1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"ReganChoy"},"content":"**Use case: Last Met**","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"ReganChoy"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"ReganChoy"},"content":"1. User marks a client as met","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"ReganChoy"},"content":"2. ClientCare updates Last Met date of client","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"ReganChoy"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"ReganChoy"},"content":"* 1a. Client does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"ReganChoy"},"content":" * 1a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"ReganChoy"},"content":"**Use case: Mark**","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"ReganChoy"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"ReganChoy"},"content":"1. User marks an appointment with client as done","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"ReganChoy"},"content":"2. ClientCare updates appointment has done","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"ReganChoy"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"ReganChoy"},"content":"* 1a. Appointment does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"ReganChoy"},"content":" * 1a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"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":430,"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":431,"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":432,"author":{"gitId":"getsquared"},"content":"4. The system should respond to user input within 2 seconds.","lastModifiedDate":"2024-03-05"},{"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":"getsquared"},"content":"* **Client**: Customers or potential customers the insurance agent wants to keep in contact with","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"getsquared"},"content":"* **Command Line Interface (CLI)**: A text-based interface to input commands to interact with the system","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":441,"author":{"gitId":"getsquared"},"content":"* **AddressBook**: The underlying system that ClientCare is built on. Interchangeable with ClientCare.","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":{"getsquared":37,"ReganChoy":66,"yorklim":10,"-":383}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eClientCare\u003c/a\u003e","lastModifiedDate":"2024-02-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"getsquared"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W12-1/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"getsquared":1,"-":66}},{"path":"docs/team/reganchoy.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"ReganChoy"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"ReganChoy"},"content":"title: \"Regan Choy\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"ReganChoy"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ReganChoy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"ReganChoy"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"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":"ReganChoy"},"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":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"ReganChoy"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"ReganChoy"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"ReganChoy"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"ReganChoy"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"ReganChoy"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"ReganChoy"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"ReganChoy"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"ReganChoy"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"ReganChoy"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"ReganChoy"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"ReganChoy"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"ReganChoy"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"ReganChoy"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"ReganChoy"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"ReganChoy":46}},{"path":"docs/team/shuqing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"getsquared"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"getsquared"},"content":"title: \"Shuqing\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"getsquared"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"getsquared"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"getsquared"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"getsquared"},"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":"getsquared"},"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":"getsquared"},"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":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"getsquared"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"getsquared"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"getsquared"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"getsquared"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"getsquared"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"getsquared"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"getsquared"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"getsquared"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"getsquared"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"getsquared"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"getsquared"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"getsquared"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"getsquared"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"getsquared"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"getsquared"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"getsquared"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"getsquared":46}},{"path":"docs/team/solomonng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"solomonng2001"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"solomonng2001"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"solomonng2001"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"solomonng2001"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"solomonng2001"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"solomonng2001"},"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":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"solomonng2001"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"solomonng2001"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"solomonng2001"},"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":"solomonng2001"},"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":"solomonng2001"},"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":"solomonng2001"},"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":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"solomonng2001"},"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":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"solomonng2001"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"solomonng2001"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"solomonng2001"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"solomonng2001"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"solomonng2001"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"solomonng2001"},"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":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"solomonng2001"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"solomonng2001"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"solomonng2001"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"solomonng2001"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"solomonng2001"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"solomonng2001"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"solomonng2001"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"solomonng2001"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"solomonng2001"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"solomonng2001"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"solomonng2001"},"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":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"solomonng2001"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"solomonng2001"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"solomonng2001"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"solomonng2001"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"solomonng2001":46}},{"path":"docs/team/yorklim.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yorklim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"yorklim"},"content":"layout: default.md","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"yorklim"},"content":"title: \"York Lim\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"yorklim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"yorklim"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"yorklim"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"yorklim"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"yorklim"},"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":"yorklim"},"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":"yorklim"},"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":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"yorklim"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"yorklim"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"yorklim"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"yorklim"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"yorklim"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"yorklim"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"yorklim"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"yorklim"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"yorklim"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"yorklim"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"yorklim"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"yorklim"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"yorklim"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"yorklim"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"yorklim"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"yorklim"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"yorklim"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"yorklim"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"yorklim"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"yorklim":46}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"solomonng2001"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W12-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W12-1/tp/actions)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp/graph/badge.svg?token\u003dSFY0S3364D)](https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp)","lastModifiedDate":"2024-02-20"},{"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":"solomonng2001"},"content":"## Project Overview","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"solomonng2001"},"content":"* This project aims to develop a desktop application called \u0027ClientCare\u0027 to assist insurance agents in managing their client relationships and follow-ups effectively.","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"solomonng2001"},"content":"* It is written in an object-oriented programming (OOP) fashion, providing a well-structured and scalable codebase.","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"solomonng2001"},"content":"* The project includes comprehensive user and developer documentation to ensure usability and maintainability.","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"solomonng2001"},"content":"* The project is named \u0027ClientCare\u0027 as it is designed to help insurance agents take care of and manage their clients effectively.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"solomonng2001"},"content":"## Additional Information","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"solomonng2001"},"content":"* For detailed documentation and updates, visit the **[ClientCare Product Website](https://ay2324s2-cs2103t-w12-1.github.io/tp/index.html)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"solomonng2001"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"solomonng2001"},"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":{"solomonng2001":12,"-":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":"getsquared"},"content":"### Chia York Lim","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"getsquared"},"content":"\u003cimg src\u003d\"images/yorklim.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"getsquared"},"content":"[[github](http://github.com/yorklim)]","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"getsquared"},"content":"[[portfolio](team/yorklim.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"getsquared"},"content":"* Role: Team lead + Code quality","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"getsquared"},"content":"* Responsibilities: Dev Ops","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"getsquared"},"content":"### Ge Shuqing","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":"\u003cimg src\u003d\"images/getsquared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"getsquared"},"content":"[[github](http://github.com/getsquared)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"[[portfolio](team/shuqing.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":"* Role: Integration + Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":"* Role: Project Advisor","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"### Regan Choy","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":"\u003cimg src\u003d\"images/reganchoy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"content":"[[github](http://github.com/ReganChoy)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"ReganChoy"},"content":"[[portfolio](team/reganchoy.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":"* Role: Deliverables + Deadline + Scheduling","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":"* Responsibilities: Model","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"solomonng2001"},"content":"### Solomon Ng","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"solomonng2001"},"content":"\u003cimg src\u003d\"images/solomonng2001.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"getsquared"},"content":"[[github](http://github.com/solomonng2001)]","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"getsquared"},"content":"[[portfolio](team/solomonng.md)]","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"solomonng2001"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"solomonng2001"},"content":"* Responsibilities: Storage","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"getsquared":13,"ReganChoy":7,"solomonng2001":4,"-":30}},{"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":"solomonng2001"},"content":"* insurance agents","lastModifiedDate":"2024-03-06"},{"lineNumber":278,"author":{"gitId":"getsquared"},"content":"* has a need to manage a significant number of clients for insurance policies","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"getsquared"},"content":"* has a need to organise schedules with clients and their details in one place","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"getsquared"},"content":"* has a need for reminders to keep in touch with clients","lastModifiedDate":"2024-03-05"},{"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":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":284,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"solomonng2001"},"content":"**Value proposition**: ","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"solomonng2001"},"content":"* conveniently manage client details and schedules faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"solomonng2001"},"content":"* Convenient tracking of when agent last checked up on clients (eg. reminders)","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"solomonng2001"},"content":"* Organise client contacts details","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"solomonng2001"},"content":"* Optimization by client’s importance (VIP status etc)","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"solomonng2001"},"content":"* Monitor client’s insurance policies","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"solomonng2001"},"content":"* Scheduler to manage appointment to ensure timely follow-up","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"ReganChoy"},"content":"|----------|-----------------|--------------------------------------------|-----------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | add a new client contact details | keep track of the clients I have |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | delete a client | remove clients that are leaving |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | find a client by name | locate details of client without having to go through the entire list |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"solomonng2001"},"content":"| `* * *` | insurance agent | list all clients | see all clients at a glance |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"solomonng2001"},"content":"| `* * *` | insurance agent | view client information | know and check client details |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"ReganChoy"},"content":"| `* *` | insurance agent | check schedules with clients on a date | keep track of what I have to do in a day |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | add the birthday of my clients | wish them happy birthday to keep in contact with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | delete policy details for a client | remove expired policies of the client |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | see when I last met a client | check in on a client that I have not met for a long time |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | mark that a schedule is completed | know that i fulfilled the appointment scheduled |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"ReganChoy"},"content":"| `* *` | insurance agent | add policy details of a client | keep track of clients and their policies |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"ReganChoy"},"content":"| `* *` | insurance agent | schedule checkup date and time for clients | so I know when to follow-up with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"getsquared"},"content":"| `*` | insurance agent | sort clients by priority | deal with client with higher priority status first |","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | track deals that I have closed | track my current progress |","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | edit my client\u0027s details | update my client\u0027s details |","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | reschedule my appointments | change the date and time of appointments with clients |","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | filter clients by importance | decide on who to prioritise on |","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"ReganChoy"},"content":"| `*` | insurance agent | get help | use the app when I am lost or confused |","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"getsquared"},"content":"(For all use cases below, the **System** is the `ClientCare` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"solomonng2001"},"content":"**Use case: UC01 - Add a new client**","lastModifiedDate":"2024-03-06"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"solomonng2001"},"content":"1. User requests to add new client.","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"solomonng2001"},"content":"2. ClientCare adds the new client to the list.","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"solomonng2001"},"content":"3. ClientCare shows a success message and \u003cu\u003edisplay view of new client details and policies (UC02)\u003c/u\u003e.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"solomonng2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"solomonng2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":336,"author":{"gitId":"solomonng2001"},"content":"* 1a. ClientCare detects invalid command usage or information.","lastModifiedDate":"2024-03-06"},{"lineNumber":337,"author":{"gitId":"solomonng2001"},"content":" * 1a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-06"},{"lineNumber":338,"author":{"gitId":"solomonng2001"},"content":" * 1a2. User enters new data.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":339,"author":{"gitId":"solomonng2001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"solomonng2001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"solomonng2001"},"content":"**Use case: UC02 - View client details and policies**","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"solomonng2001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"solomonng2001"},"content":"1. User requests to view a client\u0027s details and policies.","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"solomonng2001"},"content":"2. ClientCare shows that client\u0027s details and policies.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"getsquared"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"getsquared"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"solomonng2001"},"content":"* 1a. ClientCare detects that the client does not exist or invalid command usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"solomonng2001"},"content":" * 1a1. ClientCare shows an error message.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"solomonng2001"},"content":" * 1a2. User enters new data.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"solomonng2001"},"content":" Steps 1a1-1a2 are repeated until the data entered are correct.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"solomonng2001"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"solomonng2001"},"content":"**Use case: UC03 - List all clients**","lastModifiedDate":"2024-03-06"},{"lineNumber":359,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"solomonng2001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":361,"author":{"gitId":"solomonng2001"},"content":"1. User requests to view all clients.","lastModifiedDate":"2024-03-06"},{"lineNumber":362,"author":{"gitId":"solomonng2001"},"content":"2. ClientCare shows a list of all clients.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":363,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":366,"author":{"gitId":"solomonng2001"},"content":"* 1a. The list is empty as no clients have been added at all.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":367,"author":{"gitId":"solomonng2001"},"content":" * 1a1. ClientCare notifies that the list is empty.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":368,"author":{"gitId":"solomonng2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":369,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":371,"author":{"gitId":"solomonng2001"},"content":"**Use case: Find a client by name**","lastModifiedDate":"2024-03-06"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"getsquared"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"solomonng2001"},"content":"1. User requests to find a specific client in the list by name","lastModifiedDate":"2024-03-06"},{"lineNumber":375,"author":{"gitId":"solomonng2001"},"content":"2. ClientCare shows list of client that matches the name\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":376,"author":{"gitId":"solomonng2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":377,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":378,"author":{"gitId":"solomonng2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":379,"author":{"gitId":"solomonng2001"},"content":"* 2a. The list is empty as there is no matching name found.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":380,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":383,"author":{"gitId":"solomonng2001"},"content":"**Use case: Delete a client**","lastModifiedDate":"2024-03-06"},{"lineNumber":384,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"solomonng2001"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":386,"author":{"gitId":"getsquared"},"content":"1. User requests to list clients or find client by name","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"getsquared"},"content":"2. ClientCare shows a list of clients","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"getsquared"},"content":"3. User requests to delete a specific client in the list by index","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"solomonng2001"},"content":"4. ClientCare deletes the client\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":390,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"solomonng2001"},"content":"* 2a. The list is empty.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":394,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"solomonng2001"},"content":" * 3a1. ClientCare shows an error message.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":397,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"ReganChoy"},"content":"**Use case: Schedule**","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"ReganChoy"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"ReganChoy"},"content":"1. User schedules a date and time to meet with a client","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"ReganChoy"},"content":"2. ClientCare sets up the appointment","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"ReganChoy"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"ReganChoy"},"content":"* 1a. Date and time is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"ReganChoy"},"content":" * 1a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"ReganChoy"},"content":"* 1b. Date and time has past.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"ReganChoy"},"content":" * 1b1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"ReganChoy"},"content":"**Use case: Last Met**","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"ReganChoy"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"ReganChoy"},"content":"1. User marks a client as met","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"ReganChoy"},"content":"2. ClientCare updates Last Met date of client","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":430,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"ReganChoy"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"ReganChoy"},"content":"* 1a. Client does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":435,"author":{"gitId":"ReganChoy"},"content":" * 1a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"ReganChoy"},"content":"**Use case: Mark**","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"ReganChoy"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"ReganChoy"},"content":"1. User marks an appointment with client as done","lastModifiedDate":"2024-03-05"},{"lineNumber":444,"author":{"gitId":"ReganChoy"},"content":"2. ClientCare updates appointment has done","lastModifiedDate":"2024-03-05"},{"lineNumber":445,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":446,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":447,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":448,"author":{"gitId":"ReganChoy"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":449,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":450,"author":{"gitId":"ReganChoy"},"content":"* 1a. Appointment does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":451,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":452,"author":{"gitId":"ReganChoy"},"content":" * 1a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":453,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":454,"author":{"gitId":"ReganChoy"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"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":461,"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":462,"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":463,"author":{"gitId":"getsquared"},"content":"4. The system should respond to user input within 2 seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":464,"author":{"gitId":"solomonng2001"},"content":"5. The user interface should be intuitive and easy to use, even for users with limited technical knowledge. This includes providing clear and concise instructions, organizing information logically, and offering helpful error messages and tooltips.","lastModifiedDate":"2024-03-06"},{"lineNumber":465,"author":{"gitId":"solomonng2001"},"content":"6. The codebase should be well-structured, modular, and documented to facilitate future maintenance and enhancements. This includes adhering to coding standards, using version control, and providing comprehensive developer documentation.","lastModifiedDate":"2024-03-06"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"getsquared"},"content":"* **Client**: Customers or potential customers the insurance agent wants to keep in contact with","lastModifiedDate":"2024-03-05"},{"lineNumber":472,"author":{"gitId":"getsquared"},"content":"* **Command Line Interface (CLI)**: A text-based interface to input commands to interact with the system","lastModifiedDate":"2024-03-05"},{"lineNumber":473,"author":{"gitId":"solomonng2001"},"content":"* **Graphical User Interface (GUI)**: A visual interface to interact with the system","lastModifiedDate":"2024-03-06"},{"lineNumber":474,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":475,"author":{"gitId":"solomonng2001"},"content":"* **AddressBook**: The underlying system that ClientCare is built on. Interchangeable with ClientCare","lastModifiedDate":"2024-03-06"},{"lineNumber":476,"author":{"gitId":"solomonng2001"},"content":"* **Client Priority**: The level of importance or significance assigned to a client, which may influence the order of interactions or services provided","lastModifiedDate":"2024-03-06"},{"lineNumber":477,"author":{"gitId":"solomonng2001"},"content":"* **Policy**: An agreement or contract between an insurance company and a client, specifying the terms and conditions of insurance coverage","lastModifiedDate":"2024-03-06"},{"lineNumber":478,"author":{"gitId":"solomonng2001"},"content":"* **Scheduler**: A feature of the ClientCare application that allows users to manage and organize appointments and follow-ups with clients","lastModifiedDate":"2024-03-06"},{"lineNumber":479,"author":{"gitId":"solomonng2001"},"content":"* **Reminder**: A notification or alert generated by the ClientCare application to remind users of upcoming appointments or follow-ups with clients","lastModifiedDate":"2024-03-06"},{"lineNumber":480,"author":{"gitId":"solomonng2001"},"content":"* **Last Met**: The date on which the user last interacted with a client, used for tracking and monitoring client interactions","lastModifiedDate":"2024-03-06"},{"lineNumber":481,"author":{"gitId":"solomonng2001"},"content":"* **Refresh**: A command or action that updates the information displayed in the ClientCare application to reflect the most recent data","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"solomonng2001"},"content":"* **Help**: A feature of the ClientCare application that provides assistance, guidance, or instructions to users on how to use the application","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":492,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"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/box\u003e","lastModifiedDate":"2023-09-12"},{"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":"-"},"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":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"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":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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"},{"lineNumber":513,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"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":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"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":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"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":527,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"getsquared":28,"solomonng2001":62,"ReganChoy":66,"-":381}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eClientCare\u003c/a\u003e","lastModifiedDate":"2024-02-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"getsquared"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W12-1/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"getsquared":1,"-":66}},{"path":"docs/team/reganchoy.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"ReganChoy"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"ReganChoy"},"content":"title: \"Regan Choy\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"ReganChoy"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ReganChoy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"ReganChoy"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"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":"ReganChoy"},"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":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"ReganChoy"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"ReganChoy"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"ReganChoy"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"ReganChoy"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"ReganChoy"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"ReganChoy"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"ReganChoy"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"ReganChoy"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"ReganChoy"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"ReganChoy"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"ReganChoy"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"ReganChoy"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"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":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"ReganChoy"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"ReganChoy"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"ReganChoy":46}},{"path":"docs/team/shuqing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"getsquared"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"getsquared"},"content":"title: \"Shuqing\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"getsquared"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"getsquared"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"getsquared"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"getsquared"},"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":"getsquared"},"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":"getsquared"},"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":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"getsquared"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"getsquared"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"getsquared"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"getsquared"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"getsquared"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"getsquared"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"getsquared"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"getsquared"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"getsquared"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"getsquared"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"getsquared"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"getsquared"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"getsquared"},"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":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"getsquared"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"getsquared"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"getsquared"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"getsquared"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"getsquared":46}},{"path":"docs/team/yorklim.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yorklim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"yorklim"},"content":"layout: default.md","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"yorklim"},"content":"title: \"York Lim\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"yorklim"},"content":"---","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"yorklim"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"yorklim"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"yorklim"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"yorklim"},"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":"yorklim"},"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":"yorklim"},"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":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"yorklim"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"yorklim"},"content":"* **Project management**:","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"yorklim"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"yorklim"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"yorklim"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"yorklim"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"yorklim"},"content":" * User Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"yorklim"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"yorklim"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"yorklim"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"yorklim"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"yorklim"},"content":"* **Community**:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"yorklim"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"yorklim"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"yorklim"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"yorklim"},"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":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"yorklim"},"content":"* **Tools**:","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"yorklim"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"yorklim"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"yorklim"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"yorklim"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"yorklim":46}}] diff --git a/AY2324S2-CS2103T-W12-1_tp_master/commits.json b/AY2324S2-CS2103T-W12-1_tp_master/commits.json index 8f01af40..1443ee46 100644 --- a/AY2324S2-CS2103T-W12-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W12-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"getsquared":[{"date":"2024-03-05","commitResults":[{"hash":"39ea1f1fa1afce0456ff0b1288151b2aa0449569","isMergeCommit":false,"messageTitle":"Add info to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"3a3e3f5c068f6a3534397c6af710f823b850e8ed","isMergeCommit":false,"messageTitle":"Update info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"8a0f965fcf9f26b526ed4efbe62b47b3d0163cfc","isMergeCommit":false,"messageTitle":"Update Website Navbar Github Link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"69226491532efdc47d888697436b1ed041a072bf","isMergeCommit":false,"messageTitle":"Update DG Requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":18}}}]}],"ReganChoy":[{"date":"2024-02-25","commitResults":[{"hash":"3a7ec979d8f15325c7f31b1f51946536fae91b31","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":86,"deletions":0}}},{"hash":"1910c330493fb2d66724749ae4650a6620903b7a","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":148,"deletions":46}}}]},{"date":"2024-03-05","commitResults":[{"hash":"bb196b2ea48c3731d2c9a1488986a7b56bb99fca","isMergeCommit":true,"messageTitle":"Merge pull request #25 from getsquared/add-getsquared-info","messageBody":"Add Shuqing AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"082c80138aee6a0d3502c740f66e1149243df4f2","isMergeCommit":true,"messageTitle":"Merge pull request #35 from getsquared/update-docs-settings","messageBody":"Update Website Navbar Github Link","fileTypesAndContributionMap":{}},{"hash":"0c737d7b30e0a18c54fe2e92ac075384da7f9266","isMergeCommit":true,"messageTitle":"Merge pull request #36 from getsquared/add-dg-requirements","messageBody":"Update DG Requirements","fileTypesAndContributionMap":{}},{"hash":"0a2ab9906b6efcc28bd28d1b4ae79d363c21fa73","isMergeCommit":false,"messageTitle":"Reset master branch back to origin state","messageBody":"Copy origin src folder back into the branch\n","fileTypesAndContributionMap":{"functional-code":{"insertions":11,"deletions":48}}},{"hash":"1fea686b0b0fdf00852a3f757d5fcd9f06e9d197","isMergeCommit":false,"messageTitle":"Remove MetCommand class file","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":91}}},{"hash":"972427777c85a30d40d854d851bb01e288eabde8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f8649316089211b45b834035c45817648d078d4","isMergeCommit":false,"messageTitle":"Add ReganChoy AboutUs info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":0}}},{"hash":"dfe3a7435b5f895b1dcfa0bd766f33c5abfb9161","isMergeCommit":false,"messageTitle":"Fix naming error in aboutMe","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"9385de5870c9d8724b5b5c1574f93ae70954a1d9","isMergeCommit":false,"messageTitle":"Fix check errors","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":60},"docs":{"insertions":46,"deletions":46}}},{"hash":"92ec9e71b08cf1fc39b353a29400805a944ed1a0","isMergeCommit":false,"messageTitle":"Remove MetCommandParser class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":60}}},{"hash":"f9d3c07ac18070cb6ac3fa31c6cd819362b5dca2","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"New user stories and use cases added\n","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":13}}},{"hash":"2f69924289af36f3d350f163ae5f18ed63aad7b7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d6a4f7f233bf78904313f82f3db2955cf6874a8e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-developer_guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"88d563da18e03f80b44eba74cab1ab0d0e4f8324","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6b3ef448f2734b8901ff003427acade2fb442c89","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"398a53ad1f4f809ddd95f3c26658422e5cc5b06d","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d1426d76a8b3246f89ea96ee2813864d20df9ef4","isMergeCommit":false,"messageTitle":"Fix check error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":46}}},{"hash":"e8b970379ab2f138cacf921042797847023c5037","isMergeCommit":false,"messageTitle":"Test commit changes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5eecc4e946a3596f4de07c8b2b339b2555aa5d8a","isMergeCommit":false,"messageTitle":"Remove test text","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4998ec9ad409b80a075c16dd15f3821306e6fb43","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"6cad6e952437b63036deca6232d38fdd3e784761","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-developer_guide","messageBody":"","fileTypesAndContributionMap":{}}]}],"solomonng2001":[{"date":"2024-03-05","commitResults":[{"hash":"735042ec98fecd4dcfbb1dc9a63885e98103cfa1","isMergeCommit":false,"messageTitle":"Add solomonng info in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"9373c40d227a562e98f1957a46fb86ad97e12767","isMergeCommit":false,"messageTitle":"Refactor solomonng2001 photo link in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7609ad60931949f6f6a8e02bfd363e0736272924","isMergeCommit":true,"messageTitle":"Merge pull request #47 from ReganChoy/branch_aboutus","messageBody":"Add ReganChoy AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"5285950245ad9624602d5954e2bb16ac335fb1bb","isMergeCommit":true,"messageTitle":"Merge fix for met class errors Merge branch \u0027master\u0027 into add-solomonng-aboutus","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"9ab6a92f4726fed2053b25944e1f9cf547130e92","isMergeCommit":true,"messageTitle":"Merge pull request #51 from yorklim/AboutUs","messageBody":"Add Yorklim AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"be503811835a7dbb7bbdc6f13822cf068826293b","isMergeCommit":true,"messageTitle":"Merge pull request #52 from yorklim/DevGuide","messageBody":"Add User stories to DevGuide","fileTypesAndContributionMap":{}}]}],"yorklim":[{"date":"2024-03-06","commitResults":[{"hash":"1b0f8c9f7d675c1a147026367750ba7fc20541f9","isMergeCommit":true,"messageTitle":"Merge pull request #49 from solomonng2001/add-solomonng-aboutus","messageBody":"Add solomonng aboutus info","fileTypesAndContributionMap":{}},{"hash":"feb839f4769b31f88f94e01e1a74693e6788bd56","isMergeCommit":false,"messageTitle":"Add Yorklim AboutUs Info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}},{"hash":"ec659f4ce686e625757d679cf00d2d318376abb0","isMergeCommit":true,"messageTitle":"Merge pull request #48 from ReganChoy/branch-developer_guide","messageBody":"Update DG Requirements","fileTypesAndContributionMap":{}},{"hash":"b29f82bd28e53da5e51aa4ce907c8d814544dd46","isMergeCommit":false,"messageTitle":"Add User stories to DevGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":20}}}]}]},"authorFileTypeContributionMap":{"getsquared":{"docs":89,"functional-code":0,"test-code":0},"ReganChoy":{"docs":119,"functional-code":0,"test-code":0},"solomonng2001":{"docs":51,"functional-code":0,"test-code":0},"yorklim":{"docs":62,"functional-code":0,"test-code":0}},"authorContributionVariance":{"getsquared":1022.4853,"ReganChoy":30385.207,"solomonng2001":238.86388,"yorklim":812.94684},"authorDisplayNameMap":{"getsquared":"CS2103T-W12-1 GE S..QING","ReganChoy":"CS2103T-W12-1 REGA..N FU","solomonng2001":"CS2103T-W12-1 NG R..OMON","yorklim":"CS2103T-W12-1 CHIA.. LIM"}} +{"authorDailyContributionsMap":{"getsquared":[{"date":"2024-03-05","commitResults":[{"hash":"39ea1f1fa1afce0456ff0b1288151b2aa0449569","isMergeCommit":false,"messageTitle":"Add info to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"3a3e3f5c068f6a3534397c6af710f823b850e8ed","isMergeCommit":false,"messageTitle":"Update info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"8a0f965fcf9f26b526ed4efbe62b47b3d0163cfc","isMergeCommit":false,"messageTitle":"Update Website Navbar Github Link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"69226491532efdc47d888697436b1ed041a072bf","isMergeCommit":false,"messageTitle":"Update DG Requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":18}}}]},{"date":"2024-03-06","commitResults":[{"hash":"528d5a48633411699f7afc3bb920778872fc5299","isMergeCommit":false,"messageTitle":"Finalise AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":27}}},{"hash":"c3d9c8a2600ef2f9b18ee82da733cd630892774e","isMergeCommit":false,"messageTitle":"Delete johndoe.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":46}}},{"hash":"5f93ec6c3780aaad719946a22830b2dcbcac62b2","isMergeCommit":true,"messageTitle":"Merge pull request #53 from solomonng2001/update-developer-guide-requirements","messageBody":"Update developer guide requirements","fileTypesAndContributionMap":{}},{"hash":"9ae39b592b3f8c7ca348237b115ca08a6d8d5cde","isMergeCommit":true,"messageTitle":"Merge pull request #50 from solomonng2001/update-readme-and-contextualise-to-clientcare","messageBody":"Update readme and contextualise to clientcare","fileTypesAndContributionMap":{}},{"hash":"32a37d24e9e3a0a59038e6f55a372ffcef4b3cdd","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2a31a4e7d3ab3bf98974ac270554d309b658ae75","isMergeCommit":false,"messageTitle":"Rename member image in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"ReganChoy":[{"date":"2024-02-25","commitResults":[{"hash":"3a7ec979d8f15325c7f31b1f51946536fae91b31","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":86,"deletions":0}}},{"hash":"1910c330493fb2d66724749ae4650a6620903b7a","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":148,"deletions":46}}}]},{"date":"2024-03-05","commitResults":[{"hash":"bb196b2ea48c3731d2c9a1488986a7b56bb99fca","isMergeCommit":true,"messageTitle":"Merge pull request #25 from getsquared/add-getsquared-info","messageBody":"Add Shuqing AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"082c80138aee6a0d3502c740f66e1149243df4f2","isMergeCommit":true,"messageTitle":"Merge pull request #35 from getsquared/update-docs-settings","messageBody":"Update Website Navbar Github Link","fileTypesAndContributionMap":{}},{"hash":"0c737d7b30e0a18c54fe2e92ac075384da7f9266","isMergeCommit":true,"messageTitle":"Merge pull request #36 from getsquared/add-dg-requirements","messageBody":"Update DG Requirements","fileTypesAndContributionMap":{}},{"hash":"0a2ab9906b6efcc28bd28d1b4ae79d363c21fa73","isMergeCommit":false,"messageTitle":"Reset master branch back to origin state","messageBody":"Copy origin src folder back into the branch\n","fileTypesAndContributionMap":{"functional-code":{"insertions":11,"deletions":48}}},{"hash":"1fea686b0b0fdf00852a3f757d5fcd9f06e9d197","isMergeCommit":false,"messageTitle":"Remove MetCommand class file","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":91}}},{"hash":"972427777c85a30d40d854d851bb01e288eabde8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f8649316089211b45b834035c45817648d078d4","isMergeCommit":false,"messageTitle":"Add ReganChoy AboutUs info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":0}}},{"hash":"dfe3a7435b5f895b1dcfa0bd766f33c5abfb9161","isMergeCommit":false,"messageTitle":"Fix naming error in aboutMe","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"9385de5870c9d8724b5b5c1574f93ae70954a1d9","isMergeCommit":false,"messageTitle":"Fix check errors","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":60},"docs":{"insertions":46,"deletions":46}}},{"hash":"92ec9e71b08cf1fc39b353a29400805a944ed1a0","isMergeCommit":false,"messageTitle":"Remove MetCommandParser class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":60}}},{"hash":"f9d3c07ac18070cb6ac3fa31c6cd819362b5dca2","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"New user stories and use cases added\n","fileTypesAndContributionMap":{"docs":{"insertions":78,"deletions":13}}},{"hash":"2f69924289af36f3d350f163ae5f18ed63aad7b7","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d6a4f7f233bf78904313f82f3db2955cf6874a8e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-developer_guide","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"88d563da18e03f80b44eba74cab1ab0d0e4f8324","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6b3ef448f2734b8901ff003427acade2fb442c89","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"398a53ad1f4f809ddd95f3c26658422e5cc5b06d","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d1426d76a8b3246f89ea96ee2813864d20df9ef4","isMergeCommit":false,"messageTitle":"Fix check error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":46,"deletions":46}}},{"hash":"e8b970379ab2f138cacf921042797847023c5037","isMergeCommit":false,"messageTitle":"Test commit changes","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5eecc4e946a3596f4de07c8b2b339b2555aa5d8a","isMergeCommit":false,"messageTitle":"Remove test text","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4998ec9ad409b80a075c16dd15f3821306e6fb43","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"6cad6e952437b63036deca6232d38fdd3e784761","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-developer_guide","messageBody":"","fileTypesAndContributionMap":{}}]}],"solomonng2001":[{"date":"2024-03-05","commitResults":[{"hash":"735042ec98fecd4dcfbb1dc9a63885e98103cfa1","isMergeCommit":false,"messageTitle":"Add solomonng info in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"9373c40d227a562e98f1957a46fb86ad97e12767","isMergeCommit":false,"messageTitle":"Refactor solomonng2001 photo link in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7609ad60931949f6f6a8e02bfd363e0736272924","isMergeCommit":true,"messageTitle":"Merge pull request #47 from ReganChoy/branch_aboutus","messageBody":"Add ReganChoy AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"c748877d95521b29e25a4a13ed3209caeaf68e92","isMergeCommit":false,"messageTitle":"Update readme and contextualise to clientcare","messageBody":"Readme contains information about addressbook3.\n\nUpdating the information in readme to reflect ClientCare will provide\nproper information about our evolved product.\n\nLet\u0027s\n* Update the UI image.\n* Update project overview information.\n* Add link to our ClientCare website.\n* Add acknowledgements to creators of addressbook3.\n","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":11}}},{"hash":"5285950245ad9624602d5954e2bb16ac335fb1bb","isMergeCommit":true,"messageTitle":"Merge fix for met class errors Merge branch \u0027master\u0027 into add-solomonng-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"763edff42dcd4d6e339a6155e786836a2a51609e","isMergeCommit":false,"messageTitle":"Fix checkstyle error","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"b4e7f75bfee88b409b7925b144d9813f7c269407","isMergeCommit":false,"messageTitle":"Update developer guide requirements","messageBody":"Limited use cases, glossary and non-functional requirements.\n\nExtending on requirements documentation will ease future references.\n\nLet\u0027s\n* Add use cases for add client, view a client and list all clients.\n* Expand the glossary to include important nouns in main features.\n* Expand non-functional requirements to include characteristics of our\ncode base and user interface.\n","fileTypesAndContributionMap":{"docs":{"insertions":69,"deletions":18}}},{"hash":"9ab6a92f4726fed2053b25944e1f9cf547130e92","isMergeCommit":true,"messageTitle":"Merge pull request #51 from yorklim/AboutUs","messageBody":"Add Yorklim AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"65469a634a0560f30f22a1b551bd0a52721a934e","isMergeCommit":true,"messageTitle":"Handle merge conflicts in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"be503811835a7dbb7bbdc6f13822cf068826293b","isMergeCommit":true,"messageTitle":"Merge pull request #52 from yorklim/DevGuide","messageBody":"Add User stories to DevGuide","fileTypesAndContributionMap":{}},{"hash":"399ec277523f489960daea72f4a348c137475f71","isMergeCommit":false,"messageTitle":"Raise priority of view client info to high","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"08f6f4c703679a7ed80a73f80b313b2df5506c5a","isMergeCommit":true,"messageTitle":"Fix merge conflicts in user stories","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d3f4cdbbcc64bb793383300136e3db18bc4d1bf9","isMergeCommit":false,"messageTitle":"make-corrections-to-use-cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"274f2ff2ec4960cb2eb6d2b056202541dfcdefc5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-readme-and-contextualise-to-clientcare","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1abbb1fc64ee763eafa270a4242c2f9d7e598ee6","isMergeCommit":true,"messageTitle":"Merge pull request #54 from getsquared/update-aboutus","messageBody":"Finalise About Us","fileTypesAndContributionMap":{}},{"hash":"accf7a96b7e4e9e43f9cf005cb4a5d74060563df","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-readme-and-contextualise-to-clientcare","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5423a51a98b9be348d4891f83fac1161770ba2d9","isMergeCommit":true,"messageTitle":"Merge pull request #56 from getsquared/update-aboutus","messageBody":"Update About Us Image Name","fileTypesAndContributionMap":{}}]}],"yorklim":[{"date":"2024-03-06","commitResults":[{"hash":"1b0f8c9f7d675c1a147026367750ba7fc20541f9","isMergeCommit":true,"messageTitle":"Merge pull request #49 from solomonng2001/add-solomonng-aboutus","messageBody":"Add solomonng aboutus info","fileTypesAndContributionMap":{}},{"hash":"feb839f4769b31f88f94e01e1a74693e6788bd56","isMergeCommit":false,"messageTitle":"Add Yorklim AboutUs Info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":52,"deletions":6}}},{"hash":"ec659f4ce686e625757d679cf00d2d318376abb0","isMergeCommit":true,"messageTitle":"Merge pull request #48 from ReganChoy/branch-developer_guide","messageBody":"Update DG Requirements","fileTypesAndContributionMap":{}},{"hash":"b29f82bd28e53da5e51aa4ce907c8d814544dd46","isMergeCommit":false,"messageTitle":"Add User stories to DevGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":20}}}]}]},"authorFileTypeContributionMap":{"getsquared":{"docs":88,"functional-code":0,"test-code":0},"ReganChoy":{"docs":119,"functional-code":0,"test-code":0},"solomonng2001":{"docs":78,"functional-code":0,"test-code":0},"yorklim":{"docs":46,"functional-code":0,"test-code":0}},"authorContributionVariance":{"getsquared":1393.7751,"ReganChoy":30385.207,"solomonng2001":987.77515,"yorklim":812.94684},"authorDisplayNameMap":{"getsquared":"CS2103T-W12-1 GE S..QING","ReganChoy":"CS2103T-W12-1 REGA..N FU","solomonng2001":"CS2103T-W12-1 NG R..OMON","yorklim":"CS2103T-W12-1 CHIA.. LIM"}} diff --git a/AY2324S2-CS2103T-W12-3_tp_master/authorship.json b/AY2324S2-CS2103T-W12-3_tp_master/authorship.json index 41268814..cd616518 100644 --- a/AY2324S2-CS2103T-W12-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W12-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"darkvoid32"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W12-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W12-3/tp/actions)","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp/graph/badge.svg?token\u003dZAZ8O2FN70)](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp)","lastModifiedDate":"2024-02-18"},{"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":"darkvoid32"},"content":"## AssetBook-3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"darkvoid32"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"darkvoid32"},"content":"## Acknowledgement","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"darkvoid32"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"darkvoid32":8,"-":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":"darkvoid32"},"content":"### Tang Yetong","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"darkvoid32"},"content":"\u003cimg src\u003d\"images/darkvoid32.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"darkvoid32"},"content":"[[homepage](https://darkvoid32.github.io/)]","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"darkvoid32"},"content":"[[github](https://github.com/darkvoid32)]","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"darkvoid32"},"content":"[[portfolio](team/darkvoid32.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"yisiox"},"content":"* Roles: Developer \u0026 Tester","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"yisiox"},"content":"* Responsibilities: Full-stack development and writing tests.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"### Leong Heng Yew","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":"\u003cimg src\u003d\"images/aureliony.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":"[[github](http://github.com/aureliony)]","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":"[[portfolio](team/aureliony.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"yisiox"},"content":"* Roles: Java Expert","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":"* Responsibilities: Helps other team members with matters related to the Java programming language.","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"bryanyee33"},"content":"### Yee Jun Hyeok Bryan","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"bryanyee33"},"content":"\u003cimg src\u003d\"images/bryanyee33.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"bryanyee33"},"content":"[[github](http://github.com/bryanyee33)]","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"bryanyee33"},"content":"[[portfolio](team/bryanyee33.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"yisiox"},"content":"* Roles: UI \u0026 UX expert","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"bryanyee33"},"content":"* Responsibilities: Manages things related to the UI \u0026 UX such as JavaFX and design.","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"darkvoid32"},"content":"### Muhammad Rizki Bayuaji","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"darkvoid32"},"content":"\u003cimg src\u003d\"images/rizkidelta.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"darkvoid32"},"content":"[[github](http://github.com/rizkidelta)]","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"darkvoid32"},"content":"[[portfolio](team/rizkidelta.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"yisiox"},"content":"* Roles: Developer \u0026 Designer","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"yisiox"},"content":"* Responsibilities: Full-stack development and designing UI mockups or other components ","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"yisiox"},"content":"that are used in the application.","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"yisiox"},"content":"### Guk Yi Siong","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yisiox"},"content":"\u003cimg src\u003d\"images/yisiox.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"yisiox"},"content":"[[github](http://github.com/yisiox)]","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"yisiox"},"content":"[[portfolio](team/yisiox.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"yisiox"},"content":"* Role: Developer \u0026 Taskmaster","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"yisiox"},"content":"* Responsibilities: Full-stack development and documentation.","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"yisiox"},"content":"In charge of defining, assigning, and tracking project tasks.","lastModifiedDate":"2024-03-04"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"darkvoid32":9,"yisiox":14,"aureliony":5,"bryanyee33":5,"-":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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"aureliony"},"content":"#### Product Design","lastModifiedDate":"2024-03-03"},{"lineNumber":333,"author":{"gitId":"aureliony"},"content":"1. Target user is clearly narrowed down to logistics managers.","lastModifiedDate":"2024-03-03"},{"lineNumber":334,"author":{"gitId":"aureliony"},"content":"1. Majority of the target users are likely to find the app worth using.","lastModifiedDate":"2024-03-03"},{"lineNumber":335,"author":{"gitId":"aureliony"},"content":"1. Users 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-03"},{"lineNumber":336,"author":{"gitId":"aureliony"},"content":"1. Features should fit together cohesively.","lastModifiedDate":"2024-03-03"},{"lineNumber":337,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":338,"author":{"gitId":"aureliony"},"content":"#### Codebase","lastModifiedDate":"2024-03-03"},{"lineNumber":339,"author":{"gitId":"aureliony"},"content":"1. Must follow CS2103/T coding standards and code quality guidelines.","lastModifiedDate":"2024-03-03"},{"lineNumber":340,"author":{"gitId":"aureliony"},"content":"1. Must demonstrate evidence of:","lastModifiedDate":"2024-03-03"},{"lineNumber":341,"author":{"gitId":"aureliony"},"content":" 1. logging","lastModifiedDate":"2024-03-03"},{"lineNumber":342,"author":{"gitId":"aureliony"},"content":" 1. exceptions","lastModifiedDate":"2024-03-03"},{"lineNumber":343,"author":{"gitId":"aureliony"},"content":" 1. assertions","lastModifiedDate":"2024-03-03"},{"lineNumber":344,"author":{"gitId":"aureliony"},"content":" 1. defensive coding","lastModifiedDate":"2024-03-03"},{"lineNumber":345,"author":{"gitId":"aureliony"},"content":"1. Should have Single Level of Abstraction Principle (SLAP) applied at a reasonable level.","lastModifiedDate":"2024-03-03"},{"lineNumber":346,"author":{"gitId":"aureliony"},"content":"1. Should not have any noticeable code duplication.","lastModifiedDate":"2024-03-03"},{"lineNumber":347,"author":{"gitId":"aureliony"},"content":"1. Should be easily extensible for new features.","lastModifiedDate":"2024-03-03"},{"lineNumber":348,"author":{"gitId":"aureliony"},"content":"1. Should have high level testability with good coverage.","lastModifiedDate":"2024-03-03"},{"lineNumber":349,"author":{"gitId":"aureliony"},"content":"1. Should have little to no bugs.","lastModifiedDate":"2024-03-03"},{"lineNumber":350,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":351,"author":{"gitId":"aureliony"},"content":"#### Program","lastModifiedDate":"2024-03-03"},{"lineNumber":352,"author":{"gitId":"aureliony"},"content":"1. Should be optimized for the target user (logistics managers).","lastModifiedDate":"2024-03-03"},{"lineNumber":353,"author":{"gitId":"aureliony"},"content":"1. Should work on any mainstream OS as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-03"},{"lineNumber":354,"author":{"gitId":"aureliony"},"content":"1. Should work without internet access.","lastModifiedDate":"2024-03-03"},{"lineNumber":355,"author":{"gitId":"aureliony"},"content":"1. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"aureliony"},"content":"1. Should not crash under typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"aureliony"},"content":"1. Should not log or collect any unnecessary user data.","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"aureliony"},"content":"1. Response time for all commands and operations should be less than 1 second.","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"aureliony"},"content":"#### Documentation","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"aureliony"},"content":"1. The target user should understand how to use the product easily by reading the User Guide.","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"aureliony"},"content":"1. User Guide should have higher overall quality compared to AddressBook-Level3 (AB3).","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"aureliony"},"content":"1. A new team member should understand the product\u0027s internal design easily by reading the Developer Guide.","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"aureliony"},"content":"1. Developer Guide should have higher overall quality compared to AB3.","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"aureliony"},"content":"#### Project Management","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"aureliony"},"content":"1. Project should be done iteratively and incrementally.","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"aureliony"},"content":"1. Project should demonstrate good use of these GitHub mechanisms:","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"aureliony"},"content":" 1. milestones","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"aureliony"},"content":" 1. releases","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"aureliony"},"content":" 1. issue tracker (with good task definition, assignment, and tracking)","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"aureliony"},"content":" 1. PRs, and PR reviews","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"aureliony"},"content":"1. Project should demonstrate good use of version control.","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"aureliony"},"content":"1. Developers should attempt to use the forking workflow at least for the early stages of the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"aureliony"},"content":"1. Developers should make good use of time buffers.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":380,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":390,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":391,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"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":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"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":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"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":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"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":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"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":425,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"aureliony":44,"-":391}},{"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":"bryanyee33"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eAssetBook-3\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":"bryanyee33"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W12-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-29"},{"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":{"bryanyee33":2,"-":65}},{"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":"bryanyee33"},"content":"# AssetBook-3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"bryanyee33"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W12-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W12-3/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"bryanyee33"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp)","lastModifiedDate":"2024-02-29"},{"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":"bryanyee33"},"content":"**AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"bryanyee33"},"content":"* If you are interested in using AssetBook-3, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"bryanyee33"},"content":"* If you are interested about developing AssetBook-3, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-02"},{"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"},{"lineNumber":22,"author":{"gitId":"bryanyee33"},"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":{"bryanyee33":7,"-":15}},{"path":"docs/team/aureliony.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":" layout: default.md","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":" title: \"Leong Heng Yew\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"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-02"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":"* **Project management**:","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" * User Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":"* **Community**:","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":"* **Tools**:","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"aureliony":38}},{"path":"docs/team/bryanyee33.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bryanyee33"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"bryanyee33"},"content":" layout: default.md","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"bryanyee33"},"content":" title: \"Bryan Yee\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"bryanyee33"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"bryanyee33"},"content":"### Project: AssetBook-3","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"bryanyee33"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"bryanyee33"},"content":"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-02"},{"lineNumber":11,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"bryanyee33"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"bryanyee33"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"bryanyee33"},"content":" * What it does:","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"bryanyee33"},"content":" * Justification:","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"bryanyee33"},"content":" * Highlights:","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"bryanyee33"},"content":" * Credits:","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"bryanyee33"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"bryanyee33"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"bryanyee33"},"content":"* **Project management**:","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"bryanyee33"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"bryanyee33"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"bryanyee33"},"content":" * User Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"bryanyee33"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"bryanyee33"},"content":"* **Community**:","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"bryanyee33"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"bryanyee33"},"content":" * Contributed to forum discussions (examples: )","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"bryanyee33"},"content":" * Reported bugs and suggestions for other teams in the class (examples: )","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"bryanyee33"},"content":" * Some parts of the history feature I added was adopted by several other class mates ()","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"bryanyee33"},"content":"* **Tools**:","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"bryanyee33":38}},{"path":"docs/team/darkvoid32.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"darkvoid32"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"darkvoid32"},"content":" title: \"Tang Yetong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"darkvoid32"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"darkvoid32"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"darkvoid32"},"content":"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":11,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"darkvoid32"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"darkvoid32"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"darkvoid32"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"darkvoid32"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"darkvoid32"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"darkvoid32"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"darkvoid32"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"darkvoid32"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"darkvoid32"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"darkvoid32"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"darkvoid32"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"darkvoid32"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"darkvoid32"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"darkvoid32"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"darkvoid32":38}},{"path":"docs/team/rizkidelta.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"darkvoid32"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"darkvoid32"},"content":" title: \"Muhammad Rizki Bayuaji\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"darkvoid32"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"darkvoid32"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"darkvoid32"},"content":"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":11,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"darkvoid32"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"darkvoid32"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"darkvoid32"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"darkvoid32"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"darkvoid32"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"darkvoid32"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"darkvoid32"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"darkvoid32"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"darkvoid32"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"darkvoid32"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"darkvoid32"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"darkvoid32"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"darkvoid32"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"darkvoid32"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"darkvoid32":38}},{"path":"docs/team/yisiox.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yisiox"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"yisiox"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"yisiox"},"content":" title: \"Guk Yi Siong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"yisiox"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"yisiox"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"yisiox"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"yisiox"},"content":"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":11,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"yisiox"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"yisiox"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"yisiox"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"yisiox"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"yisiox"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"yisiox"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"yisiox"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"yisiox"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"yisiox"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"yisiox"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"yisiox"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"yisiox"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"yisiox"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"yisiox"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"yisiox":38}},{"path":"src/main/java/seedu/address/commons/util/JsonUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.commons.util;","lastModifiedDate":"2016-09-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"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.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonAutoDetect;","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.PropertyAccessor;","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.core.JsonProcessingException;","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationContext;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationFeature;","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ObjectMapper;","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.SerializationFeature;","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.module.SimpleModule;","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2016-10-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.DataLoadingException;","lastModifiedDate":"2023-06-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Converts a Java object instance to JSON and vice versa","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class JsonUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonUtil.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" private static final ObjectMapper objectMapper \u003d new ObjectMapper().findAndRegisterModules()","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":" .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" .registerModule(new SimpleModule(\"Logger\")","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" .addSerializer(Level.class, new ToStringSerializer())","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" .addDeserializer(Level.class, new LevelDeserializer(Level.class)));","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" static \u003cT\u003e void serializeObjectToJsonFile(Path jsonFile, T objectToSerialize) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(jsonFile, toJsonString(objectToSerialize));","lastModifiedDate":"2016-10-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" static \u003cT\u003e T deserializeObjectFromJsonFile(Path jsonFile, Class\u003cT\u003e classOfObjectToDeserialize)","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return fromJsonString(FileUtil.readFromFile(jsonFile), classOfObjectToDeserialize);","lastModifiedDate":"2016-10-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns the JSON object from the given file or {@code Optional.empty()} object if the file is not found.","lastModifiedDate":"2023-06-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * If any values are missing from the file, default values will be used, as long as the file is a valid JSON file.","lastModifiedDate":"2023-06-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * @param filePath cannot be null.","lastModifiedDate":"2016-10-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @param classOfObjectToDeserialize JSON file has to correspond to the structure in the class given here.","lastModifiedDate":"2023-06-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading of the JSON file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Optional\u003cT\u003e readJsonFile(","lastModifiedDate":"2016-10-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Path filePath, Class\u003cT\u003e classOfObjectToDeserialize) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!Files.exists(filePath)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2016-10-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.info(\"JSON file \" + filePath + \" found.\");","lastModifiedDate":"2023-01-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" T jsonFile;","lastModifiedDate":"2016-10-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-10-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":" jsonFile \u003d deserializeObjectFromJsonFile(filePath, classOfObjectToDeserialize);","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-10-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" logger.warning(\"Error reading from jsonFile file \" + filePath + \": \" + e);","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new DataLoadingException(e);","lastModifiedDate":"2023-06-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Optional.of(jsonFile);","lastModifiedDate":"2016-10-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Saves the Json object to the specified file.","lastModifiedDate":"2016-10-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * Overwrites existing file if it exists, creates a new file if it doesn\u0027t.","lastModifiedDate":"2016-10-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param jsonFile cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param filePath cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @throws IOException if there was an error during writing to the file","lastModifiedDate":"2016-10-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public static \u003cT\u003e void saveJsonFile(T jsonFile, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" requireNonNull(jsonFile);","lastModifiedDate":"2017-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" serializeObjectToJsonFile(filePath, jsonFile);","lastModifiedDate":"2018-04-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Converts a given string representation of a JSON data to instance of a class","lastModifiedDate":"2016-10-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * @return The instance of T with the specified values in the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public static \u003cT\u003e T fromJsonString(String json, Class\u003cT\u003e instanceClass) throws IOException {","lastModifiedDate":"2016-10-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return objectMapper.readValue(json, instanceClass);","lastModifiedDate":"2016-10-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Converts a given instance of a class into its JSON data string representation","lastModifiedDate":"2016-10-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @param instance The T object to be converted into the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @return JSON data representation of the given class instance, in string","lastModifiedDate":"2016-10-19"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static \u003cT\u003e String toJsonString(T instance) throws JsonProcessingException {","lastModifiedDate":"2016-10-19"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(instance);","lastModifiedDate":"2016-10-19"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Contains methods that retrieve logging level from serialized string.","lastModifiedDate":"2017-08-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private static class LevelDeserializer extends FromStringDeserializer\u003cLevel\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" protected LevelDeserializer(Class\u003c?\u003e vc) {","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" super(vc);","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" protected Level _deserialize(String value, DeserializationContext ctxt) {","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return getLoggingLevel(value);","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Gets the logging level that matches loggingLevelString","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * \u003cp\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Returns null if there are no matches","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private Level getLoggingLevel(String loggingLevelString) {","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return Level.parse(loggingLevelString);","lastModifiedDate":"2016-09-09"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public Class\u003cLevel\u003e handledType() {","lastModifiedDate":"2016-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return Level.class;","lastModifiedDate":"2016-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"aureliony":8,"-":136}},{"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":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" .append(\"; Tags: \")","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" .append(person.getTags());","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":2,"-":49}},{"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":"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":"-"},"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":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-26"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":49,"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":50,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":84,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":96,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":99,"author":{"gitId":"aureliony"},"content":" Tags updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2024-02-28"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2017-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":131,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":135,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":136,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":137,"author":{"gitId":"aureliony"},"content":" private Tags tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":144,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":146,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":149,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":153,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":154,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":155,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);","lastModifiedDate":"2018-08-14"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":160,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":161,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":165,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":168,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":169,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":177,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":180,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":181,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":184,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":185,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","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":"aureliony"},"content":" public void setTags(Tags tags) {","lastModifiedDate":"2024-02-28"},{"lineNumber":193,"author":{"gitId":"aureliony"},"content":" this.tags \u003d tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":196,"author":{"gitId":"aureliony"},"content":" public Optional\u003cTags\u003e getTags() {","lastModifiedDate":"2024-02-28"},{"lineNumber":197,"author":{"gitId":"aureliony"},"content":" return Optional.ofNullable(tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":200,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":201,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":202,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":203,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":206,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":208,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":211,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":212,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":213,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":214,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":215,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":216,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":230,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"aureliony":11,"-":219}},{"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":"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":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-02-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-03-17"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":35,"author":{"gitId":"-"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2017-12-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":41,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" Tags tags \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" Person person \u003d new Person(name, phone, email, address, tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"aureliony":7,"-":53}},{"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":"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":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2024-02-28"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2024-02-28"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"aureliony"},"content":" private Optional\u003cTags\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2024-02-28"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2024-02-28"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2024-02-28"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2024-02-28"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"aureliony":2,"-":82}},{"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":"","lastModifiedDate":"2017-02-11"},{"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.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":60,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","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":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":76,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":79,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"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":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","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":"aureliony"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Tags}.","lastModifiedDate":"2024-02-28"},{"lineNumber":102,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":103,"author":{"gitId":"aureliony"},"content":" public static Tags parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":105,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-02-28"},{"lineNumber":106,"author":{"gitId":"aureliony"},"content":" return new Tags(tags.toArray(new String[0]));","lastModifiedDate":"2024-02-28"},{"lineNumber":107,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-02-28"},{"lineNumber":108,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":111,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"aureliony":24,"-":88}},{"path":"src/main/java/seedu/address/model/person/NameContainsKeywordsPredicate.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2017-06-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-06-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Tests that a {@code Person}\u0027s {@code Name} matches any of the keywords given.","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicate implements Predicate\u003cPerson\u003e {","lastModifiedDate":"2018-01-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final List\u003cString\u003e keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public NameContainsKeywordsPredicate(List\u003cString\u003e keywords) {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" this.keywords \u003d keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public boolean test(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return keywords.stream()","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" .anyMatch(keyword -\u003e StringUtil.containsWordIgnoreCase(person.getName().toString(), keyword));","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!(other instanceof NameContainsKeywordsPredicate)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate otherNameContainsKeywordsPredicate \u003d (NameContainsKeywordsPredicate) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return keywords.equals(otherNameContainsKeywordsPredicate.keywords);","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"keywords\", keywords).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"aureliony":1,"-":43}},{"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.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" private final Tags tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" public Person(Name name, Phone phone, Email email, Address address, Tags tags) {","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":" this.tags \u003d tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" @JsonCreator","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" private Person(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" @JsonProperty(\"tags\") String[] tagNames) {","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" requireAllNonNull(name, phone, email, address, tagNames);","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" this.tags \u003d new Tags(tagNames);","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"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":"aureliony"},"content":" public Tags getTags() {","lastModifiedDate":"2024-02-28"},{"lineNumber":73,"author":{"gitId":"aureliony"},"content":" return tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return true;","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":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":99,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"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":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"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":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":22,"-":107}},{"path":"src/main/java/seedu/address/model/person/UniquePersonList.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.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2018-01-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Iterator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.databind.annotation.JsonDeserialize;","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2017-06-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2017-06-09"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":"import seedu.address.storage.UniquePersonListDeserializer;","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * A list of persons that enforces uniqueness between its elements and does not allow nulls.","lastModifiedDate":"2016-09-22"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * A person is considered unique by comparing using {@code Person#isSamePerson(Person)}. As such, adding and updating of","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * persons uses Person#isSamePerson(Person) for equality so as to ensure that the person being added or updated is","lastModifiedDate":"2018-04-19"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * unique in terms of identity in the UniquePersonList. However, the removal of a person uses Person#equals(Object) so","lastModifiedDate":"2018-04-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * as to ensure that the person with exactly the same fields will be removed.","lastModifiedDate":"2018-04-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Supports a minimal set of list operations.","lastModifiedDate":"2016-09-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @see Person#isSamePerson(Person)","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":"@JsonDeserialize(using \u003d UniquePersonListDeserializer.class)","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":"public class UniquePersonList implements Iterable\u003cPerson\u003e {","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalList \u003d FXCollections.observableArrayList();","lastModifiedDate":"2016-10-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Returns true if the list contains an equivalent person as the given argument.","lastModifiedDate":"2016-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public boolean contains(Person toCheck) {","lastModifiedDate":"2018-01-10"},{"lineNumber":38,"author":{"gitId":"-"},"content":" requireNonNull(toCheck);","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return internalList.stream().anyMatch(toCheck::isSamePerson);","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Adds a person to the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * The person must not already exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public void add(Person toAdd) {","lastModifiedDate":"2018-08-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(toAdd);","lastModifiedDate":"2017-05-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (contains(toAdd)) {","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" internalList.add(toAdd);","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Replaces the person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * {@code target} must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireAllNonNull(target, editedPerson);","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" int index \u003d internalList.indexOf(target);","lastModifiedDate":"2017-06-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (index \u003d\u003d -1) {","lastModifiedDate":"2017-06-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2017-06-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" if (!target.isSamePerson(editedPerson) \u0026\u0026 contains(editedPerson)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-12-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" internalList.set(index, editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Removes the equivalent person from the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * The person must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void remove(Person toRemove) {","lastModifiedDate":"2018-08-07"},{"lineNumber":79,"author":{"gitId":"-"},"content":" requireNonNull(toRemove);","lastModifiedDate":"2017-05-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" if (!internalList.remove(toRemove)) {","lastModifiedDate":"2018-02-28"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void setPersons(UniquePersonList replacement) {","lastModifiedDate":"2016-10-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" requireNonNull(replacement);","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" internalList.setAll(replacement.internalList);","lastModifiedDate":"2018-08-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Replaces the contents of this list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":95,"author":{"gitId":"-"},"content":" requireAllNonNull(persons);","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" if (!personsAreUnique(persons)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2018-01-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":" internalList.setAll(persons);","lastModifiedDate":"2018-08-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-09-01"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * Returns the backing list as an unmodifiable {@code ObservableList}.","lastModifiedDate":"2017-09-01"},{"lineNumber":105,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-09-01"},{"lineNumber":106,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-26"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e asUnmodifiableObservableList() {","lastModifiedDate":"2018-04-05"},{"lineNumber":108,"author":{"gitId":"aureliony"},"content":" return FXCollections.unmodifiableObservableList(internalList);","lastModifiedDate":"2024-02-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public Iterator\u003cPerson\u003e iterator() {","lastModifiedDate":"2016-08-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return internalList.iterator();","lastModifiedDate":"2016-08-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":118,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" if (!(other instanceof UniquePersonList)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" UniquePersonList otherUniquePersonList \u003d (UniquePersonList) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return internalList.equals(otherUniquePersonList.internalList);","lastModifiedDate":"2023-07-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":133,"author":{"gitId":"-"},"content":" return internalList.hashCode();","lastModifiedDate":"2016-09-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-24"},{"lineNumber":138,"author":{"gitId":"-"},"content":" return internalList.toString();","lastModifiedDate":"2019-02-24"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Returns true if {@code persons} contains only unique persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" private boolean personsAreUnique(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-04-19"},{"lineNumber":145,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c persons.size() - 1; i++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" for (int j \u003d i + 1; j \u003c persons.size(); j++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":" if (persons.get(i).isSamePerson(persons.get(j))) {","lastModifiedDate":"2018-04-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-19"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":152,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":7,"-":147}},{"path":"src/main/java/seedu/address/model/person/fields/Address.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s address in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Address implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d \"Addresses can take any values, and it should not be blank\";","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" private final String address;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Constructs an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @param address A valid address.","lastModifiedDate":"2017-05-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Address(String address) {","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(address), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" this.address \u003d address;","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","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":" * Returns true if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" return address;","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"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":"-"},"content":" if (!(other instanceof Address)) {","lastModifiedDate":"2023-07-13"},{"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":"-"},"content":" Address otherAddress \u003d (Address) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" return address.equals(otherAddress.address);","lastModifiedDate":"2024-02-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"aureliony"},"content":" return address.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":14,"-":54}},{"path":"src/main/java/seedu/address/model/person/fields/Email.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s email in the address book.","lastModifiedDate":"2018-02-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Email implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2021-07-20"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2018-02-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2021-07-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"characters.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":20,"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":21,"author":{"gitId":"-"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2021-07-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // alphanumeric and special characters","lastModifiedDate":"2018-02-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2021-07-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2021-07-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2021-07-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" private final String email;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Constructs an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":40,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * @param email A valid email address.","lastModifiedDate":"2017-05-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public Email(String email) {","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-15"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(email), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" this.email \u003d email;","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"aureliony"},"content":" return email;","lastModifiedDate":"2024-02-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (!(other instanceof Email)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return false;","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":" Email otherEmail \u003d (Email) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"aureliony"},"content":" return email.equals(otherEmail.email);","lastModifiedDate":"2024-02-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"aureliony"},"content":" return email.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":13,"-":69}},{"path":"src/main/java/seedu/address/model/person/fields/Field.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"/**","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":" * Represents an interface for Person fields.","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"public interface Field {","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"aureliony":8}},{"path":"src/main/java/seedu/address/model/person/fields/Name.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s name in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Name implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2018-04-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" private final String name;","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code Name}.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @param name A valid name.","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Name(String name) {","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(name), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" this.name \u003d name;","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid name.","lastModifiedDate":"2018-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" return name;","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (!(other instanceof Name)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Name otherName \u003d (Name) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":" return name.equals(otherName.name);","lastModifiedDate":"2024-02-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"aureliony"},"content":" return name.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":14,"-":55}},{"path":"src/main/java/seedu/address/model/person/fields/Phone.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s phone number in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Phone implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Phone numbers should only contain numbers, and it should be at least 3 digits long\";","lastModifiedDate":"2018-04-04"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"\\\\d{3,}\";","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" private final String phone;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Constructs a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param phone A valid phone number.","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Phone(String phone) {","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-15"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(phone), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" this.phone \u003d phone;","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid phone number.","lastModifiedDate":"2018-04-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" return phone;","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!(other instanceof Phone)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return false;","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":" Phone otherPhone \u003d (Phone) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" return phone.equals(otherPhone.phone);","lastModifiedDate":"2024-02-27"},{"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 int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" return phone.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":14,"-":49}},{"path":"src/main/java/seedu/address/model/person/fields/Tags.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import java.util.Set;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"/**","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":" * Represents an abstraction for a list of tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"public class Tags implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" private final Set\u003cTag\u003e tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" /**","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" * Constructs a new Tags from a list of tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" * @param tags A list of tags, or null.","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" public Tags(Tag... tags) {","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" this.tags \u003d Stream.of(tags)","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" .collect(Collectors.toUnmodifiableSet());","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" /**","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" * Constructs a new Tags from a list of strings.","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" * @param tagNames A list of strings, or null.","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" public Tags(String... tagNames) {","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" this.tags \u003d Stream.of(tagNames)","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" .map(Tag::new)","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" .collect(Collectors.toUnmodifiableSet());","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" private Set\u003cTag\u003e get() {","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" return tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"aureliony"},"content":" public Stream\u003cTag\u003e stream() {","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" return tags.stream();","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" public String toString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" return tags.toString();","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"aureliony"},"content":" return true;","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"aureliony"},"content":" if (!(other instanceof Tags)) {","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"aureliony"},"content":" return false;","lastModifiedDate":"2024-02-28"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":62,"author":{"gitId":"aureliony"},"content":" Tags otherTags \u003d (Tags) other;","lastModifiedDate":"2024-02-28"},{"lineNumber":63,"author":{"gitId":"aureliony"},"content":" return tags.equals(otherTags.tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":64,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":65,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":66,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":67,"author":{"gitId":"aureliony"},"content":" public int hashCode() {","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"aureliony"},"content":" return tags.hashCode();","lastModifiedDate":"2024-02-28"},{"lineNumber":69,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":70,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":71,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"aureliony":71}},{"path":"src/main/java/seedu/address/model/tag/Tag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.tag;","lastModifiedDate":"2016-09-21"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Tag in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Tag {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d \"Tags names should be alphanumeric\";","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"\\\\p{Alnum}+\";","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" private final String tagName;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Constructs a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param tagName A valid tag name.","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Tag(String tagName) {","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(tagName);","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" tagName \u003d tagName.trim();","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(tagName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" public String get() {","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" return tagName;","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid tag name.","lastModifiedDate":"2016-09-22"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!(other instanceof Tag)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return false;","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":" Tag otherTag \u003d (Tag) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return tagName.equals(otherTag.tagName);","lastModifiedDate":"2023-07-13"},{"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 int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return tagName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Format state as text for viewing.","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return \u0027[\u0027 + tagName + \u0027]\u0027;","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":13,"-":57}},{"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 seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-20"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" public static Tags getTagSet(String... strings) {","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" return new Tags(strings);","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"aureliony":7,"-":47}},{"path":"src/main/java/seedu/address/storage/JsonAddressBookStorage.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 static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.DataLoadingException;","lastModifiedDate":"2023-06-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.FileUtil;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.JsonUtil;","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A class to access AddressBook data stored as a json file on the hard disk.","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorage implements AddressBookStorage {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonAddressBookStorage.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" private final Path filePath;","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public JsonAddressBookStorage(Path filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return readAddressBook(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Similar to {@link #readAddressBook()}.","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" Optional\u003cAddressBook\u003e addressBook \u003d JsonUtil.readJsonFile(filePath, AddressBook.class);","lastModifiedDate":"2024-02-26"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" if (!addressBook.isPresent()) {","lastModifiedDate":"2024-02-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" return Optional.of(addressBook.get());","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, filePath);","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":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Similar to {@link #saveAddressBook(ReadOnlyAddressBook)}.","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" requireNonNull(addressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" FileUtil.createIfMissing(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"aureliony"},"content":" JsonUtil.saveJsonFile(addressBook, filePath);","lastModifiedDate":"2024-02-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"aureliony":6,"-":67}},{"path":"src/main/java/seedu/address/storage/UniquePersonListDeserializer.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.storage;","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import java.io.IOException;","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import java.util.List;","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.core.JsonParser;","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.core.JsonProcessingException;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.databind.DeserializationContext;","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.databind.deser.std.StdDeserializer;","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.UniquePersonList;","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"/**","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" * Implements a custom deserializer for UniquePersonList,","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" * as Jackson does not support JavaFX collections.","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"public class UniquePersonListDeserializer extends StdDeserializer\u003cUniquePersonList\u003e {","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" public UniquePersonListDeserializer() {","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" this(null);","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" public UniquePersonListDeserializer(Class\u003c?\u003e vc) {","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" super(vc);","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" public UniquePersonList deserialize(JsonParser parser,","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" DeserializationContext context) throws IOException, JsonProcessingException {","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" List\u003cPerson\u003e persons \u003d context.readValue(parser,","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" context.getTypeFactory().constructCollectionType(List.class, Person.class));","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" UniquePersonList upl \u003d new UniquePersonList();","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" upl.setPersons(persons);","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" return upl;","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"aureliony":38}},{"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":"aureliony"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"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":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" name.setText(person.getName().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" phone.setText(person.getPhone().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"aureliony"},"content":" address.setText(person.getAddress().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" email.setText(person.getEmail().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" .sorted(Comparator.comparing(Tag::get))","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"aureliony"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.get())));","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"aureliony":8,"-":53}},{"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":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":51,"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":52,"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":53,"author":{"gitId":"-"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-07-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2017-07-05"},{"lineNumber":55,"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":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":115,"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":116,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":122,"author":{"gitId":"aureliony"},"content":" final String[] splitName \u003d person.getName().toString().split(\"\\\\s+\");","lastModifiedDate":"2024-03-02"},{"lineNumber":123,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"aureliony":1,"-":127}},{"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":"-"},"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.NAME_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2017-12-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2017-12-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" private final AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2018-07-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)","lastModifiedDate":"2018-07-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2023-07-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2023-07-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2023-07-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":" + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // valid value followed by invalid 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, validExpectedPersonString + INVALID_NAME_DESC,","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, validExpectedPersonString + INVALID_EMAIL_DESC,","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, validExpectedPersonString + INVALID_PHONE_DESC,","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, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":129,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":130,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,","lastModifiedDate":"2017-12-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":135,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":137,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":139,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":155,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":161,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":164,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":168,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":175,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2017-12-23"},{"lineNumber":176,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":178,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":180,"author":{"gitId":"aureliony"},"content":" + INVALID_TAG_DESC + VALID_TAG_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":182,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":183,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC);","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2017-12-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":190,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"aureliony":7,"-":183}},{"path":"src/test/java/seedu/address/logic/parser/CommandParserTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-07-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertThrows;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.Command;","lastModifiedDate":"2017-07-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-07-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Contains helper methods for testing command parsers.","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class CommandParserTestUtil {","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is successful and the command created","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * equals to {@code expectedCommand}.","lastModifiedDate":"2017-07-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static void assertParseSuccess(Parser\u003c? extends Command\u003e parser, String userInput,","lastModifiedDate":"2022-02-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Command expectedCommand) {","lastModifiedDate":"2022-02-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Command command \u003d parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertEquals(expectedCommand, command);","lastModifiedDate":"2017-07-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(\"Invalid userInput.\", pe);","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is unsuccessful and the error message","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * equals to {@code expectedMessage}.","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static void assertParseFailure(Parser\u003c? extends Command\u003e parser, String userInput, String expectedMessage) {","lastModifiedDate":"2022-02-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-07-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" throw new AssertionError(\"The expected ParseException was not thrown.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-07-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, pe.getMessage());","lastModifiedDate":"2017-07-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":" /**","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"aureliony"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is unsuccessful.","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" public static void assertParseFailure(Parser\u003c? extends Command\u003e parser, String userInput) {","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" assertThrows(ParseException.class, () -\u003e parser.parse(userInput));","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"aureliony":9,"-":39}},{"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":"-"},"content":"import seedu.address.logic.commands.DeleteCommand;","lastModifiedDate":"2017-06-09"},{"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":"aureliony"},"content":" private final DeleteCommandParser parser \u003d new DeleteCommandParser();","lastModifiedDate":"2024-02-29"},{"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":"-"},"content":" assertParseSuccess(parser, \"1\", new DeleteCommand(INDEX_FIRST_PERSON));","lastModifiedDate":"2017-07-06"},{"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":"-"},"content":" assertParseFailure(parser, \"a\", String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"aureliony":1,"-":31}},{"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":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"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_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"-5\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"0\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":81,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC); // invalid name","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC); // invalid phone","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_EMAIL_DESC); // invalid email","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_ADDRESS_DESC); // invalid address","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_TAG_DESC); // invalid tag","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":88,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC + EMAIL_DESC_AMY);","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":92,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_DESC_HUSBAND + TAG_EMPTY);","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_EMPTY + TAG_DESC_HUSBAND);","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND);","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":97,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_AMY + VALID_PHONE_AMY);","lastModifiedDate":"2024-03-02"},{"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":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND","lastModifiedDate":"2017-06-06"},{"lineNumber":104,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND;","lastModifiedDate":"2017-06-06"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":108,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":109,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":117,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":119,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + NAME_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":131,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":136,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":138,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"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":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":143,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"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":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + ADDRESS_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":149,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();","lastModifiedDate":"2017-05-04"},{"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":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + TAG_DESC_FRIEND;","lastModifiedDate":"2017-05-25"},{"lineNumber":155,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":156,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"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":"","lastModifiedDate":"2017-05-04"},{"lineNumber":160,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":163,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":166,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + PHONE_DESC_BOB;","lastModifiedDate":"2023-07-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":169,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":172,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + INVALID_PHONE_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":174,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":176,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":177,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":178,"author":{"gitId":"-"},"content":" + TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND","lastModifiedDate":"2017-05-25"},{"lineNumber":179,"author":{"gitId":"-"},"content":" + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;","lastModifiedDate":"2017-05-25"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":182,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":184,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":185,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC","lastModifiedDate":"2023-07-14"},{"lineNumber":186,"author":{"gitId":"-"},"content":" + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":188,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":189,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":192,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":194,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":195,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":197,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"aureliony":10,"-":192}},{"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":"-"},"content":"import seedu.address.logic.commands.FindCommand;","lastModifiedDate":"2017-06-27"},{"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":"aureliony"},"content":" private final FindCommandParser parser \u003d new FindCommandParser();","lastModifiedDate":"2024-02-29"},{"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":"-"},"content":" assertParseFailure(parser, \" \", String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsFindCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // no leading and trailing whitespaces","lastModifiedDate":"2017-06-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" FindCommand expectedFindCommand \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\")));","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"Alice Bob\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // multiple whitespaces between keywords","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \" \\n Alice \\n \\t Bob \\t\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-27"}],"authorContributionMap":{"aureliony":1,"-":33}},{"path":"src/test/java/seedu/address/logic/parser/ParserUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"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.parser.ParserUtil.MESSAGE_INVALID_INDEX;","lastModifiedDate":"2017-06-02"},{"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.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-05-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-22"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ParserUtilTest {","lastModifiedDate":"2017-05-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2017-05-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2017-05-22"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2017-05-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d \"Rachel Walker\";","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d \"123456\";","lastModifiedDate":"2017-05-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d \"123 Main Street #0505\";","lastModifiedDate":"2017-05-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d \"rachel@example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_1 \u003d \"friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_2 \u003d \"neighbour\";","lastModifiedDate":"2017-05-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String WHITESPACE \u003d \" \\t\\r\\n\";","lastModifiedDate":"2017-05-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void parseIndex_invalidInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseIndex(\"10 a\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void parseIndex_outOfRangeInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_INVALID_INDEX, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" -\u003e ParserUtil.parseIndex(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2019-03-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void parseIndex_validInput_success() throws Exception {","lastModifiedDate":"2017-05-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // No whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\"1\"));","lastModifiedDate":"2017-05-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // Leading and trailing whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\" 1 \"));","lastModifiedDate":"2017-05-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void parseName_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseName((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void parseName_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseName(INVALID_NAME));","lastModifiedDate":"2019-03-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void parseName_validValueWithoutWhitespace_returnsName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(VALID_NAME));","lastModifiedDate":"2017-05-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" String nameWithWhitespace \u003d WHITESPACE + VALID_NAME + WHITESPACE;","lastModifiedDate":"2017-05-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace));","lastModifiedDate":"2017-05-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void parsePhone_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePhone((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void parsePhone_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePhone(INVALID_PHONE));","lastModifiedDate":"2019-03-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE));","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" String phoneWithWhitespace \u003d WHITESPACE + VALID_PHONE + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public void parseAddress_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseAddress((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void parseAddress_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseAddress(INVALID_ADDRESS));","lastModifiedDate":"2019-03-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-22"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":119,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":121,"author":{"gitId":"-"},"content":" String addressWithWhitespace \u003d WHITESPACE + VALID_ADDRESS + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-30"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void parseEmail_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmail((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public void parseEmail_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmail(INVALID_EMAIL));","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":138,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-22"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL));","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":142,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":144,"author":{"gitId":"-"},"content":" String emailWithWhitespace \u003d WHITESPACE + VALID_EMAIL + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void parseTags_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTags(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":154,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":155,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithInvalidTags_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, INVALID_TAG)));","lastModifiedDate":"2019-03-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":159,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":160,"author":{"gitId":"aureliony"},"content":" public void parseTags_emptyCollection_returnsEmptyTags() throws Exception {","lastModifiedDate":"2024-02-28"},{"lineNumber":161,"author":{"gitId":"aureliony"},"content":" assertEquals(new Tags(new Tag[0]), ParserUtil.parseTags(Collections.emptyList()));","lastModifiedDate":"2024-02-28"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":164,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":165,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":166,"author":{"gitId":"aureliony"},"content":" Tags actualTags \u003d ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, VALID_TAG_2));","lastModifiedDate":"2024-02-28"},{"lineNumber":167,"author":{"gitId":"aureliony"},"content":" Tags expectedTags \u003d new Tags(new Tag(VALID_TAG_1), new Tag(VALID_TAG_2));","lastModifiedDate":"2024-02-28"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":169,"author":{"gitId":"aureliony"},"content":" assertEquals(expectedTags, actualTags);","lastModifiedDate":"2024-02-28"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":171,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-22"}],"authorContributionMap":{"aureliony":10,"-":161}},{"path":"src/test/java/seedu/address/model/ModelManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model;","lastModifiedDate":"2017-05-31"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"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.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"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":"2017-07-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2017-07-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-31"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.testutil.AddressBookBuilder;","lastModifiedDate":"2017-05-31"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ModelManagerTest {","lastModifiedDate":"2017-05-31"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private ModelManager modelManager \u003d new ModelManager();","lastModifiedDate":"2018-08-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertEquals(new GuiSettings(), modelManager.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(new AddressBook(), new AddressBook(modelManager.getAddressBook()));","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefs_nullUserPrefs_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setUserPrefs(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void setUserPrefs_validUserPrefs_copiesUserPrefs() {","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"address/book/file/path\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1, 2, 3, 4));","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" modelManager.setUserPrefs(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(userPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Modifying userPrefs should not modify modelManager\u0027s userPrefs","lastModifiedDate":"2018-12-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs oldUserPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"new/address/book/file/path\"));","lastModifiedDate":"2018-12-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(oldUserPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setGuiSettings(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setGuiSettings_validGuiSettings_setsGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(1, 2, 3, 4);","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" modelManager.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertEquals(guiSettings, modelManager.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setAddressBookFilePath(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_validPath_setsAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Path path \u003d Paths.get(\"address/book/file/path\");","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" modelManager.setAddressBookFilePath(path);","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(path, modelManager.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.hasPerson(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(modelManager.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" modelManager.addPerson(ALICE);","lastModifiedDate":"2018-08-06"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(modelManager.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e modelManager.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-31"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"-"},"content":" AddressBook addressBook \u003d new AddressBookBuilder().withPerson(ALICE).withPerson(BENSON).build();","lastModifiedDate":"2017-07-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" AddressBook differentAddressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" modelManager \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2018-08-06"},{"lineNumber":104,"author":{"gitId":"-"},"content":" ModelManager modelManagerCopy \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2017-05-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManagerCopy));","lastModifiedDate":"2017-05-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManager));","lastModifiedDate":"2017-05-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(null));","lastModifiedDate":"2017-05-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(5));","lastModifiedDate":"2017-05-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":" // different addressBook -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(differentAddressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // different filteredList -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":120,"author":{"gitId":"aureliony"},"content":" String[] keywords \u003d ALICE.getName().toString().split(\"\\\\s+\");","lastModifiedDate":"2024-03-02"},{"lineNumber":121,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(keywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" // resets modelManager to initial state for upcoming tests","lastModifiedDate":"2017-08-05"},{"lineNumber":125,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // different userPrefs -\u003e returns false","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" UserPrefs differentUserPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":" differentUserPrefs.setAddressBookFilePath(Paths.get(\"differentFilePath\"));","lastModifiedDate":"2018-08-09"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, differentUserPrefs)));","lastModifiedDate":"2018-11-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-31"}],"authorContributionMap":{"aureliony":1,"-":131}},{"path":"src/test/java/seedu/address/model/person/fields/AddressTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class AddressTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Address(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidAddress_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Address(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Address(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" public void constructor_validAddress_success() {","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // valid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Address(\"Blk 456, Den Road, #01-355\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Address(\"-\")); // one character","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" new Address(\"Leng Inc; 1234 Market St; San Francisco CA 2349879; USA\")); // long address","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Address address \u003d new Address(\"Valid Address\");","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertTrue(address.equals(new Address(\"Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertTrue(address.equals(address));","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertFalse(address.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(address.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(address.equals(new Address(\"Other Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":10,"-":42}},{"path":"src/test/java/seedu/address/model/person/fields/EmailTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class EmailTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Email(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidEmail_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // blank email","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // missing parts","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"@example.com\")); // missing local part","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"peterjackexample.com\")); // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"peterjack@\")); // missing domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // invalid parts","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@-\")); // invalid domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@exam_ple.com\")); // underscore in domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" new Email(\"peter jack@example.com\")); // spaces in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@exam ple.com\")); // spaces in domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" new Email(\" peterjack@example.com\")); // leading space","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.com \")); // trailing space","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@@example.com\")); // double \u0027@\u0027 symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" new Email(\"peter@jack@example.com\")); // \u0027@\u0027 symbol in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" new Email(\"-peterjack@example.com\")); // local part starts with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack-@example.com\")); // local part ends with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" new Email(\"peter..jack@example.com\")); // local part has two consecutive periods","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example@com\")); // \u0027@\u0027 symbol in domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@.example.com\")); // domain name starts with a period","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.com.\")); // domain name ends with a period","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@-example.com\")); // domain name starts with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.com-\")); // domain name ends with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.c\")); // top level domain has less than two chars","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":65,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"aureliony"},"content":" public void constructor_validEmail_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack_1190@example.com\")); // underscore in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack.1190@example.com\")); // period in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack+1190@example.com\")); // \u0027+\u0027 symbol in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack-1190@example.com\")); // hyphen in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"a@bc\")); // minimal","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"test@localhost\")); // alphabets only","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"123@145\")); // numeric local part and domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"a1+be.d@example1.com\")); // mixture of alphanumeric and special characters","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"peter_jack@very-very-very-long-example.com\")); // long domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"if.you.dream.it_you.can.do.it@example.com\")); // long local part","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"e1234567@u.nus.edu\")); // more than one period in domain","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Email email \u003d new Email(\"valid@email\");","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertTrue(email.equals(new Email(\"valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(email.equals(email));","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertFalse(email.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" assertFalse(email.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertFalse(email.equals(new Email(\"other.valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":55,"-":44}},{"path":"src/test/java/seedu/address/model/person/fields/NameTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class NameTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Name(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\"peter*\")); // contains non-alphanumeric characters","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" public void constructor_validName_success() {","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"peter jack\")); // alphabets only","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"12345\")); // numbers only","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"peter the 2nd\")); // alphanumeric characters","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"Capital Tan\")); // with capital letters","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"David Roger Jackson Ray Jr 2nd\")); // long names","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Name name \u003d new Name(\"Valid Name\");","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(name.equals(new Name(\"Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertTrue(name.equals(name));","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(name.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(name.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(name.equals(new Name(\"Other Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":13,"-":41}},{"path":"src/test/java/seedu/address/model/person/fields/PhoneTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class PhoneTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Phone(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidPhone_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"91\")); // less than 3 numbers","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"phone\")); // non-numeric","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"9011p041\")); // alphabets within digits","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"9312 1534\")); // spaces within digits","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" public void constructor_validPhone_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Phone(\"911\")); // exactly 3 numbers","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Phone(\"93121534\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Phone(\"124293842033123\")); // long phone numbers","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Phone phone \u003d new Phone(\"999\");","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(new Phone(\"999\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(phone));","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(new Phone(\"995\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":12,"-":41}},{"path":"src/test/java/seedu/address/model/person/fields/TagsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"class TagsTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":" private static final String[] emptyStringArray \u003d new String[0];","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final Tag[] emptyTagArray \u003d new Tag[0];","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" public void constructor_emptyArray_success() {","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" assertEquals(new Tags(emptyTagArray), new Tags(emptyStringArray));","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" void equals_null_false() {","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" assertNotEquals(null, new Tags(emptyTagArray));","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"aureliony":26}},{"path":"src/test/java/seedu/address/model/tag/TagTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.tag;","lastModifiedDate":"2017-12-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class TagTest {","lastModifiedDate":"2017-12-04"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":10,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":12,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Tag(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void constructor_invalidTagName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"Hello@World\")); // not alphanumeric","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"Testing 123\")); // contains space","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"Café123\")); // contains illegal unicode character","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void isValidTagName() {","lastModifiedDate":"2017-12-04"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"a\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"abc\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"validTag\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"ValidTag\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"VALIDTAG\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-12-04"}],"authorContributionMap":{"aureliony":10,"-":22}},{"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 seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","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":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":30,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} 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 withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","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":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":66,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"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":72,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":75,"author":{"gitId":"aureliony"},"content":" descriptor.setTags(new Tags(tags));","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"aureliony":6,"-":76}},{"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 seedu.address.model.person.Person;","lastModifiedDate":"2017-04-05"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" public static final String[] DEFAULT_TAGS \u003d { };","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" private Tags tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" tags \u003d new Tags(DEFAULT_TAGS);","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" tags \u003d personToCopy.getTags();","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return new Person(name, phone, email, address, tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"aureliony":9,"-":85}},{"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":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_NAME).append(person.getName()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_PHONE).append(person.getPhone()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_EMAIL).append(person.getEmail()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_ADDRESS).append(person.getAddress()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" s -\u003e sb.append(PREFIX_TAG).append(s.get()).append(\" \")","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" public static String getEditPersonDescriptorDetails(EditCommand.EditPersonDescriptor descriptor) {","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" descriptor.getTags().get().stream().forEach(s -\u003e sb.append(PREFIX_TAG).append(s.get()).append(\" \"));","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"aureliony":14,"-":42}},{"path":"src/test/java/seedu/address/testutil/TypicalPersonsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.testutil;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalPersons;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import java.util.List;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"class TypicalPersonsTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" void execute_getTypicalAddressBook_success() {","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" AddressBook ab \u003d getTypicalAddressBook();","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" void execute_getTypicalPersons_success() {","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" List\u003cPerson\u003e list \u003d getTypicalPersons();","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"aureliony":23}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"darkvoid32"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W12-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W12-3/tp/actions)","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp/graph/badge.svg?token\u003dZAZ8O2FN70)](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp)","lastModifiedDate":"2024-02-18"},{"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":"darkvoid32"},"content":"## AssetBook-3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"darkvoid32"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"darkvoid32"},"content":"## Acknowledgement","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"darkvoid32"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"darkvoid32":8,"-":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":"darkvoid32"},"content":"### Tang Yetong","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"darkvoid32"},"content":"\u003cimg src\u003d\"images/darkvoid32.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"darkvoid32"},"content":"[[homepage](https://darkvoid32.github.io/)]","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"darkvoid32"},"content":"[[github](https://github.com/darkvoid32)]","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"darkvoid32"},"content":"[[portfolio](team/darkvoid32.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"yisiox"},"content":"* Roles: Developer \u0026 Tester","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"yisiox"},"content":"* Responsibilities: Full-stack development and writing tests.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"### Leong Heng Yew","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":"\u003cimg src\u003d\"images/aureliony.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":"[[github](http://github.com/aureliony)]","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":"[[portfolio](team/aureliony.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"yisiox"},"content":"* Roles: Java Expert","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":"* Responsibilities: Helps other team members with matters related to the Java programming language.","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"bryanyee33"},"content":"### Yee Jun Hyeok Bryan","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"bryanyee33"},"content":"\u003cimg src\u003d\"images/bryanyee33.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"bryanyee33"},"content":"[[github](http://github.com/bryanyee33)]","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"bryanyee33"},"content":"[[portfolio](team/bryanyee33.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"yisiox"},"content":"* Roles: UI \u0026 UX expert","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"bryanyee33"},"content":"* Responsibilities: Manages things related to the UI \u0026 UX such as JavaFX and design.","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"darkvoid32"},"content":"### Muhammad Rizki Bayuaji","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"darkvoid32"},"content":"\u003cimg src\u003d\"images/rizkidelta.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"darkvoid32"},"content":"[[github](http://github.com/rizkidelta)]","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"darkvoid32"},"content":"[[portfolio](team/rizkidelta.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"yisiox"},"content":"* Roles: Developer \u0026 Designer","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"yisiox"},"content":"* Responsibilities: Full-stack development and designing UI mockups or other components ","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"yisiox"},"content":"that are used in the application.","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"yisiox"},"content":"### Guk Yi Siong","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yisiox"},"content":"\u003cimg src\u003d\"images/yisiox.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"yisiox"},"content":"[[github](http://github.com/yisiox)]","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"yisiox"},"content":"[[portfolio](team/yisiox.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"yisiox"},"content":"* Role: Developer \u0026 Taskmaster","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"yisiox"},"content":"* Responsibilities: Full-stack development and documentation.","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"yisiox"},"content":"In charge of defining, assigning, and tracking project tasks.","lastModifiedDate":"2024-03-04"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"darkvoid32":9,"yisiox":14,"aureliony":5,"bryanyee33":5,"-":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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"bryanyee33"},"content":"* logistic managers","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"bryanyee33"},"content":"* has a need to manage a significant number of POCs \u0026 assets","lastModifiedDate":"2024-03-05"},{"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":"bryanyee33"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"bryanyee33"},"content":"* manage contacts \u0026 assets faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"bryanyee33"},"content":"* easily search for information by any category","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"bryanyee33"},"content":"* easily copy contact information to clipboard","lastModifiedDate":"2024-03-05"},{"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":"bryanyee33"},"content":"|---|---|---|---|","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"bryanyee33"},"content":"| `* * *` | user | add new contacts and assets | keep track of these details |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"bryanyee33"},"content":"| `* * *` | user | add tags to contacts | categorize them according to my preferences and workflow |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"bryanyee33"},"content":"| `* * *` | user | delete contacts | update the list if a PoC’s details are no longer needed |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"bryanyee33"},"content":"| `* * *` | user | edit contacts/tags | change details without recreating contacts, as there are too many details to re-add |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"bryanyee33"},"content":"| `* * *` | user | easily view my existing contacts from the GUI | visually find the contacts I\u0027m looking for |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"bryanyee33"},"content":"| `* * *` | user | easily navigate between sponsors, assets, and PoCs | access relevant information quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"bryanyee33"},"content":"| `* * *` | user | search contacts by name, asset, or tag | easily find the relevant PoC |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"bryanyee33"},"content":"| `* *` | new user | view a drop-down suggestion of commands | efficiently navigate and utilize the app without extensive prior knowledge |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"bryanyee33"},"content":"| `* *` | user | see no advertisements | not be distracted from my tasks |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"bryanyee33"},"content":"| `* *` | user | add secondary personnel associated with an asset | have a backup contact if the main person is unreachable |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"bryanyee33"},"content":"| `* *` | user | toggle between light/dark theme | customize the app to my preferences |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"bryanyee33"},"content":"| `* *` | user | resize the app’s window | easily use multiple apps at once |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"bryanyee33"},"content":"| `* *` | user | change the profile picture of each contact | easily identify them |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"bryanyee33"},"content":"| `* *` | user | easily search within the system even if I mistype a few words | more easily locate relevant information |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"bryanyee33"},"content":"| `* *` | hurried user | type commands even with extra whitespaces | won’t have to waste time retyping commands |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"bryanyee33"},"content":"| `* *` | advanced user | type shorter commands | type commands faster |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"bryanyee33"},"content":"| `* *` | advanced user | use keyboard shortcuts | use the app more efficiently |","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"bryanyee33"},"content":"| `*` | advanced user | add custom fields | add more information to contacts |","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"bryanyee33"},"content":"(For all use cases below, the **System** is `AssetBook-3 (AB3)` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-06"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"bryanyee33"},"content":"**Use case: UC1 - Add a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":322,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"bryanyee33"},"content":"1. User requests to add a contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":324,"author":{"gitId":"bryanyee33"},"content":"2. User specifies details of the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":325,"author":{"gitId":"bryanyee33"},"content":"3. AB3 adds the contact.","lastModifiedDate":"2024-03-06"},{"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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"bryanyee33"},"content":"**Use case: UC2 - Add an asset**","lastModifiedDate":"2024-03-06"},{"lineNumber":331,"author":{"gitId":"bryanyee33"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":332,"author":{"gitId":"bryanyee33"},"content":"1. User requests to add an asset.","lastModifiedDate":"2024-03-06"},{"lineNumber":333,"author":{"gitId":"bryanyee33"},"content":"2. User specifies details of the asset.","lastModifiedDate":"2024-03-06"},{"lineNumber":334,"author":{"gitId":"bryanyee33"},"content":"3. AB3 adds the asset.","lastModifiedDate":"2024-03-06"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"bryanyee33"},"content":"**Use case: UC3 - Assign assets to a contact**","lastModifiedDate":"2024-03-06"},{"lineNumber":340,"author":{"gitId":"bryanyee33"},"content":"**MSS**","lastModifiedDate":"2024-03-06"},{"lineNumber":341,"author":{"gitId":"bryanyee33"},"content":"1. User requests to assign an asset to the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":342,"author":{"gitId":"bryanyee33"},"content":"2. User specifies the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":343,"author":{"gitId":"bryanyee33"},"content":"3. User specifies the asset.","lastModifiedDate":"2024-03-06"},{"lineNumber":344,"author":{"gitId":"bryanyee33"},"content":"4. AB3 assigns the asset to the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":346,"author":{"gitId":"bryanyee33"},"content":"Steps 1-4 are repeated until all the assets are assigned to the contact.","lastModifiedDate":"2024-03-06"},{"lineNumber":347,"author":{"gitId":"bryanyee33"},"content":"Use case ends.","lastModifiedDate":"2024-03-06"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"bryanyee33"},"content":"**Extensions**","lastModifiedDate":"2024-03-06"},{"lineNumber":350,"author":{"gitId":"bryanyee33"},"content":"* 2a. Contact was not created.","lastModifiedDate":"2024-03-06"},{"lineNumber":351,"author":{"gitId":"bryanyee33"},"content":" * 2a1. User exits assign request.","lastModifiedDate":"2024-03-06"},{"lineNumber":352,"author":{"gitId":"bryanyee33"},"content":" * 2a2. User creates the contact (UC1).","lastModifiedDate":"2024-03-06"},{"lineNumber":353,"author":{"gitId":"bryanyee33"},"content":" Use case resumes from step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":354,"author":{"gitId":"bryanyee33"},"content":"* 3a. Asset was not created.","lastModifiedDate":"2024-03-06"},{"lineNumber":355,"author":{"gitId":"bryanyee33"},"content":" * 3a1. User exits assign request.","lastModifiedDate":"2024-03-06"},{"lineNumber":356,"author":{"gitId":"bryanyee33"},"content":" * 3a2. User creates the asset (UC2).","lastModifiedDate":"2024-03-06"},{"lineNumber":357,"author":{"gitId":"bryanyee33"},"content":" Use case resumes from step 1.","lastModifiedDate":"2024-03-06"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"aureliony"},"content":"#### Product Design","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"aureliony"},"content":"1. Target user is clearly narrowed down to logistics managers.","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"aureliony"},"content":"1. Majority of the target users are likely to find the app worth using.","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"aureliony"},"content":"1. Users 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-03"},{"lineNumber":366,"author":{"gitId":"aureliony"},"content":"1. Features should fit together cohesively.","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"aureliony"},"content":"#### Codebase","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"aureliony"},"content":"1. Must follow CS2103/T coding standards and code quality guidelines.","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"aureliony"},"content":"1. Must demonstrate evidence of:","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"aureliony"},"content":" * logging","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"aureliony"},"content":" * exceptions","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"aureliony"},"content":" * assertions","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"aureliony"},"content":" * defensive coding","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"aureliony"},"content":"1. Should have Single Level of Abstraction Principle (SLAP) applied at a reasonable level.","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"aureliony"},"content":"1. Should not have any noticeable code duplication.","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"aureliony"},"content":"1. Should be easily extensible for new features.","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"aureliony"},"content":"1. Should have high level testability with good coverage.","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"aureliony"},"content":"1. Should have little to no bugs.","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"aureliony"},"content":"#### Program","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"aureliony"},"content":"1. Should be optimized for the target user (logistics managers).","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"aureliony"},"content":"1. Should work on any mainstream OS as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"aureliony"},"content":"1. Should work without internet access.","lastModifiedDate":"2024-03-03"},{"lineNumber":385,"author":{"gitId":"aureliony"},"content":"1. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":386,"author":{"gitId":"aureliony"},"content":"1. Should not crash under typical usage.","lastModifiedDate":"2024-03-03"},{"lineNumber":387,"author":{"gitId":"aureliony"},"content":"1. Should not log or collect any unnecessary user data.","lastModifiedDate":"2024-03-03"},{"lineNumber":388,"author":{"gitId":"aureliony"},"content":"1. Response time for all commands and operations should be less than 1 second.","lastModifiedDate":"2024-03-03"},{"lineNumber":389,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":390,"author":{"gitId":"aureliony"},"content":"#### Documentation","lastModifiedDate":"2024-03-03"},{"lineNumber":391,"author":{"gitId":"aureliony"},"content":"1. The target user should understand how to use the product easily by reading the User Guide.","lastModifiedDate":"2024-03-03"},{"lineNumber":392,"author":{"gitId":"aureliony"},"content":"1. User Guide should have higher overall quality compared to AddressBook-Level3 (AB3).","lastModifiedDate":"2024-03-03"},{"lineNumber":393,"author":{"gitId":"aureliony"},"content":"1. A new team member should understand the product\u0027s internal design easily by reading the Developer Guide.","lastModifiedDate":"2024-03-03"},{"lineNumber":394,"author":{"gitId":"aureliony"},"content":"1. Developer Guide should have higher overall quality compared to AB3.","lastModifiedDate":"2024-03-03"},{"lineNumber":395,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":396,"author":{"gitId":"aureliony"},"content":"#### Project Management","lastModifiedDate":"2024-03-03"},{"lineNumber":397,"author":{"gitId":"aureliony"},"content":"1. Project should be done iteratively and incrementally.","lastModifiedDate":"2024-03-03"},{"lineNumber":398,"author":{"gitId":"aureliony"},"content":"1. Project should demonstrate good use of these GitHub mechanisms:","lastModifiedDate":"2024-03-03"},{"lineNumber":399,"author":{"gitId":"aureliony"},"content":" * milestones","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"aureliony"},"content":" * releases","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"aureliony"},"content":" * issue tracker (with good task definition, assignment, and tracking)","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"aureliony"},"content":" * PRs, and PR reviews","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"aureliony"},"content":"1. Project should demonstrate good use of version control.","lastModifiedDate":"2024-03-03"},{"lineNumber":404,"author":{"gitId":"aureliony"},"content":"1. Developers should attempt to use the forking workflow at least for the early stages of the project.","lastModifiedDate":"2024-03-03"},{"lineNumber":405,"author":{"gitId":"aureliony"},"content":"1. Developers should make good use of time buffers.","lastModifiedDate":"2024-03-03"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":410,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":420,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"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/box\u003e","lastModifiedDate":"2023-09-12"},{"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":{"bryanyee33":53,"aureliony":44,"-":368}},{"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":"bryanyee33"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eAssetBook-3\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":"bryanyee33"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W12-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-02-29"},{"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":{"bryanyee33":2,"-":65}},{"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":"bryanyee33"},"content":"# AssetBook-3","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"bryanyee33"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W12-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W12-3/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"bryanyee33"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2324S2-CS2103T-W12-3/tp)","lastModifiedDate":"2024-02-29"},{"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":"bryanyee33"},"content":"**AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"bryanyee33"},"content":"* If you are interested in using AssetBook-3, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"bryanyee33"},"content":"* If you are interested about developing AssetBook-3, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-02"},{"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"},{"lineNumber":22,"author":{"gitId":"bryanyee33"},"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":{"bryanyee33":7,"-":15}},{"path":"docs/team/aureliony.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":" layout: default.md","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":" title: \"Leong Heng Yew\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"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-02"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":"* **Project management**:","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" * User Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":"* **Community**:","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":"* **Tools**:","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" * TODO.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"aureliony":38}},{"path":"docs/team/bryanyee33.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"bryanyee33"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"bryanyee33"},"content":" layout: default.md","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"bryanyee33"},"content":" title: \"Bryan Yee\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"bryanyee33"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"bryanyee33"},"content":"### Project: AssetBook-3","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"bryanyee33"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"bryanyee33"},"content":"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-02"},{"lineNumber":11,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"bryanyee33"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"bryanyee33"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"bryanyee33"},"content":" * What it does:","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"bryanyee33"},"content":" * Justification:","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"bryanyee33"},"content":" * Highlights:","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"bryanyee33"},"content":" * Credits:","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"bryanyee33"},"content":"* **New Feature**:","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"bryanyee33"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"bryanyee33"},"content":"* **Project management**:","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"bryanyee33"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"bryanyee33"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"bryanyee33"},"content":" * User Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"bryanyee33"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"bryanyee33"},"content":"* **Community**:","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"bryanyee33"},"content":" * PRs reviewed (with non-trivial review comments):","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"bryanyee33"},"content":" * Contributed to forum discussions (examples: )","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"bryanyee33"},"content":" * Reported bugs and suggestions for other teams in the class (examples: )","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"bryanyee33"},"content":" * Some parts of the history feature I added was adopted by several other class mates ()","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"bryanyee33"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"bryanyee33"},"content":"* **Tools**:","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"bryanyee33":38}},{"path":"docs/team/darkvoid32.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"darkvoid32"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"darkvoid32"},"content":" title: \"Tang Yetong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"darkvoid32"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"darkvoid32"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"darkvoid32"},"content":"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":11,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"darkvoid32"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"darkvoid32"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"darkvoid32"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"darkvoid32"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"darkvoid32"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"darkvoid32"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"darkvoid32"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"darkvoid32"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"darkvoid32"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"darkvoid32"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"darkvoid32"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"darkvoid32"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"darkvoid32"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"darkvoid32"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"darkvoid32":38}},{"path":"docs/team/rizkidelta.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"darkvoid32"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"darkvoid32"},"content":" title: \"Muhammad Rizki Bayuaji\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"darkvoid32"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"darkvoid32"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"darkvoid32"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"darkvoid32"},"content":"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":11,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"darkvoid32"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"darkvoid32"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"darkvoid32"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"darkvoid32"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"darkvoid32"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"darkvoid32"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"darkvoid32"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"darkvoid32"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"darkvoid32"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"darkvoid32"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"darkvoid32"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"darkvoid32"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"darkvoid32"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"darkvoid32"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"darkvoid32"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"darkvoid32"},"content":" * TODO.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"darkvoid32":38}},{"path":"docs/team/yisiox.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yisiox"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"yisiox"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"yisiox"},"content":" title: \"Guk Yi Siong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"yisiox"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"yisiox"},"content":"### Project: AssetBook3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"yisiox"},"content":"AssetBook-3 is a desktop application for logistics managers to keep track point-of-contacts\u0027 (POCs) contact information, along with their relevant assets. It is meant for those who have too many POCs and assets, and wish to easily retrieve contact details based on name, tag, or asset ID.","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"yisiox"},"content":"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":11,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"yisiox"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"yisiox"},"content":"* **New Feature**: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"yisiox"},"content":" * What it does: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"yisiox"},"content":" * Justification: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"yisiox"},"content":" * Highlights: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"yisiox"},"content":" * Credits: TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"yisiox"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"yisiox"},"content":"* **Project management**:","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"yisiox"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"yisiox"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"yisiox"},"content":" * User Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"yisiox"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"yisiox"},"content":"* **Community**:","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"yisiox"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"yisiox"},"content":"* **Tools**:","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"yisiox"},"content":" * TODO.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"yisiox":38}},{"path":"src/main/java/seedu/address/commons/util/JsonUtil.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.commons.util;","lastModifiedDate":"2016-09-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"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.io.IOException;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Files;","lastModifiedDate":"2018-04-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-04-21"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Level;","lastModifiedDate":"2017-01-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2017-01-19"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.JsonAutoDetect;","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.annotation.PropertyAccessor;","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.core.JsonProcessingException;","lastModifiedDate":"2016-08-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationContext;","lastModifiedDate":"2016-08-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.DeserializationFeature;","lastModifiedDate":"2024-02-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ObjectMapper;","lastModifiedDate":"2016-08-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.SerializationFeature;","lastModifiedDate":"2024-02-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;","lastModifiedDate":"2016-08-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.module.SimpleModule;","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;","lastModifiedDate":"2024-02-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2016-10-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.DataLoadingException;","lastModifiedDate":"2023-06-14"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Converts a Java object instance to JSON and vice versa","lastModifiedDate":"2016-08-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class JsonUtil {","lastModifiedDate":"2016-08-08"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonUtil.class);","lastModifiedDate":"2016-10-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" private static final ObjectMapper objectMapper \u003d new ObjectMapper().findAndRegisterModules()","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)","lastModifiedDate":"2024-02-26"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":" .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)","lastModifiedDate":"2024-02-26"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" .registerModule(new SimpleModule(\"Logger\")","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" .addSerializer(Level.class, new ToStringSerializer())","lastModifiedDate":"2024-02-26"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" .addDeserializer(Level.class, new LevelDeserializer(Level.class)));","lastModifiedDate":"2024-02-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":42,"author":{"gitId":"-"},"content":" static \u003cT\u003e void serializeObjectToJsonFile(Path jsonFile, T objectToSerialize) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" FileUtil.writeToFile(jsonFile, toJsonString(objectToSerialize));","lastModifiedDate":"2016-10-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":" static \u003cT\u003e T deserializeObjectFromJsonFile(Path jsonFile, Class\u003cT\u003e classOfObjectToDeserialize)","lastModifiedDate":"2018-04-21"},{"lineNumber":47,"author":{"gitId":"-"},"content":" throws IOException {","lastModifiedDate":"2016-10-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return fromJsonString(FileUtil.readFromFile(jsonFile), classOfObjectToDeserialize);","lastModifiedDate":"2016-10-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Returns the JSON object from the given file or {@code Optional.empty()} object if the file is not found.","lastModifiedDate":"2023-06-15"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * If any values are missing from the file, default values will be used, as long as the file is a valid JSON file.","lastModifiedDate":"2023-06-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2023-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * @param filePath cannot be null.","lastModifiedDate":"2016-10-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @param classOfObjectToDeserialize JSON file has to correspond to the structure in the class given here.","lastModifiedDate":"2023-06-15"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading of the JSON file failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static \u003cT\u003e Optional\u003cT\u003e readJsonFile(","lastModifiedDate":"2016-10-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Path filePath, Class\u003cT\u003e classOfObjectToDeserialize) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (!Files.exists(filePath)) {","lastModifiedDate":"2018-04-21"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2016-10-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":" logger.info(\"JSON file \" + filePath + \" found.\");","lastModifiedDate":"2023-01-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":" T jsonFile;","lastModifiedDate":"2016-10-07"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":70,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2016-10-07"},{"lineNumber":71,"author":{"gitId":"-"},"content":" jsonFile \u003d deserializeObjectFromJsonFile(filePath, classOfObjectToDeserialize);","lastModifiedDate":"2018-04-21"},{"lineNumber":72,"author":{"gitId":"-"},"content":" } catch (IOException e) {","lastModifiedDate":"2016-10-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":" logger.warning(\"Error reading from jsonFile file \" + filePath + \": \" + e);","lastModifiedDate":"2018-04-21"},{"lineNumber":74,"author":{"gitId":"-"},"content":" throw new DataLoadingException(e);","lastModifiedDate":"2023-06-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return Optional.of(jsonFile);","lastModifiedDate":"2016-10-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" * Saves the Json object to the specified file.","lastModifiedDate":"2016-10-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":" * Overwrites existing file if it exists, creates a new file if it doesn\u0027t.","lastModifiedDate":"2016-10-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * @param jsonFile cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * @param filePath cannot be null","lastModifiedDate":"2016-10-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * @throws IOException if there was an error during writing to the file","lastModifiedDate":"2016-10-07"},{"lineNumber":86,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" public static \u003cT\u003e void saveJsonFile(T jsonFile, Path filePath) throws IOException {","lastModifiedDate":"2018-04-21"},{"lineNumber":88,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2017-05-15"},{"lineNumber":89,"author":{"gitId":"-"},"content":" requireNonNull(jsonFile);","lastModifiedDate":"2017-05-15"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" serializeObjectToJsonFile(filePath, jsonFile);","lastModifiedDate":"2018-04-21"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Converts a given string representation of a JSON data to instance of a class","lastModifiedDate":"2016-10-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":98,"author":{"gitId":"-"},"content":" * @return The instance of T with the specified values in the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":100,"author":{"gitId":"-"},"content":" public static \u003cT\u003e T fromJsonString(String json, Class\u003cT\u003e instanceClass) throws IOException {","lastModifiedDate":"2016-10-19"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return objectMapper.readValue(json, instanceClass);","lastModifiedDate":"2016-10-19"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":104,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-10-19"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * Converts a given instance of a class into its JSON data string representation","lastModifiedDate":"2016-10-19"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @param instance The T object to be converted into the JSON string","lastModifiedDate":"2016-10-19"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param \u003cT\u003e The generic type to create an instance of","lastModifiedDate":"2016-10-19"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @return JSON data representation of the given class instance, in string","lastModifiedDate":"2016-10-19"},{"lineNumber":109,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-10-19"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static \u003cT\u003e String toJsonString(T instance) throws JsonProcessingException {","lastModifiedDate":"2016-10-19"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(instance);","lastModifiedDate":"2016-10-19"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-08-16"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Contains methods that retrieve logging level from serialized string.","lastModifiedDate":"2017-08-16"},{"lineNumber":116,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":117,"author":{"gitId":"-"},"content":" private static class LevelDeserializer extends FromStringDeserializer\u003cLevel\u003e {","lastModifiedDate":"2016-08-08"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":" protected LevelDeserializer(Class\u003c?\u003e vc) {","lastModifiedDate":"2016-08-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" super(vc);","lastModifiedDate":"2016-08-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":124,"author":{"gitId":"-"},"content":" protected Level _deserialize(String value, DeserializationContext ctxt) {","lastModifiedDate":"2018-08-08"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return getLoggingLevel(value);","lastModifiedDate":"2016-08-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-08"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Gets the logging level that matches loggingLevelString","lastModifiedDate":"2016-08-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * \u003cp\u003e","lastModifiedDate":"2016-08-08"},{"lineNumber":131,"author":{"gitId":"-"},"content":" * Returns null if there are no matches","lastModifiedDate":"2016-08-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-08"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-08"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private Level getLoggingLevel(String loggingLevelString) {","lastModifiedDate":"2016-08-08"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return Level.parse(loggingLevelString);","lastModifiedDate":"2016-09-09"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":138,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-08"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public Class\u003cLevel\u003e handledType() {","lastModifiedDate":"2016-08-08"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return Level.class;","lastModifiedDate":"2016-08-08"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":142,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-08"},{"lineNumber":144,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-08"}],"authorContributionMap":{"aureliony":8,"-":136}},{"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":"-"},"content":" .append(\"; Phone: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .append(person.getPhone())","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .append(\"; Email: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" .append(person.getEmail())","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" .append(\"; Address: \")","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .append(person.getAddress())","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" .append(\"; Tags: \")","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" .append(person.getTags());","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return builder.toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":2,"-":49}},{"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":"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":"-"},"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":"import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2016-12-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Objects;","lastModifiedDate":"2023-07-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2016-12-26"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.CollectionUtil;","lastModifiedDate":"2016-12-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-02-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2018-08-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-26"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-12-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Edits the details of an existing person in the address book.","lastModifiedDate":"2016-12-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"public class EditCommand extends Command {","lastModifiedDate":"2018-04-19"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"edit\";","lastModifiedDate":"2016-12-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD + \": Edits the details of the person identified \"","lastModifiedDate":"2016-12-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" + \"by the index number used in the displayed person list. \"","lastModifiedDate":"2018-04-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":" + \"Existing values will be overwritten by the input values.\\n\"","lastModifiedDate":"2016-12-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2017-06-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_NAME + \"NAME] \"","lastModifiedDate":"2017-06-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_PHONE + \"PHONE] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":41,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_EMAIL + \"EMAIL] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":42,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_ADDRESS + \"ADDRESS] \"","lastModifiedDate":"2017-05-09"},{"lineNumber":43,"author":{"gitId":"-"},"content":" + \"[\" + PREFIX_TAG + \"TAG]...\\n\"","lastModifiedDate":"2017-05-09"},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":45,"author":{"gitId":"-"},"content":" + PREFIX_PHONE + \"91234567 \"","lastModifiedDate":"2017-05-09"},{"lineNumber":46,"author":{"gitId":"-"},"content":" + PREFIX_EMAIL + \"johndoe@example.com\";","lastModifiedDate":"2017-05-09"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String MESSAGE_EDIT_PERSON_SUCCESS \u003d \"Edited Person: %1$s\";","lastModifiedDate":"2016-12-26"},{"lineNumber":49,"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":50,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DUPLICATE_PERSON \u003d \"This person already exists in the address book.\";","lastModifiedDate":"2016-12-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private final EditPersonDescriptor editPersonDescriptor;","lastModifiedDate":"2016-12-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit","lastModifiedDate":"2017-05-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @param editPersonDescriptor details to edit the person with","lastModifiedDate":"2016-12-26"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2017-05-25"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireNonNull(index);","lastModifiedDate":"2017-05-25"},{"lineNumber":61,"author":{"gitId":"-"},"content":" requireNonNull(editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2017-05-25"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.editPersonDescriptor \u003d new EditPersonDescriptor(editPersonDescriptor);","lastModifiedDate":"2016-12-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-12-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2019-01-25"},{"lineNumber":69,"author":{"gitId":"-"},"content":" requireNonNull(model);","lastModifiedDate":"2018-08-08"},{"lineNumber":70,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2018-04-19"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":72,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2018-04-19"},{"lineNumber":73,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2018-04-19"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2018-04-19"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2018-08-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2018-08-07"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-07"},{"lineNumber":83,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2018-08-17"},{"lineNumber":84,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson)));","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Creates and returns a {@code Person} with the details of {@code personToEdit}","lastModifiedDate":"2016-12-26"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * edited with {@code editPersonDescriptor}.","lastModifiedDate":"2016-12-26"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {","lastModifiedDate":"2018-01-10"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assert personToEdit !\u003d null;","lastModifiedDate":"2016-12-26"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":95,"author":{"gitId":"-"},"content":" Name updatedName \u003d editPersonDescriptor.getName().orElse(personToEdit.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":96,"author":{"gitId":"-"},"content":" Phone updatedPhone \u003d editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Email updatedEmail \u003d editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Address updatedAddress \u003d editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":99,"author":{"gitId":"aureliony"},"content":" Tags updatedTags \u003d editPersonDescriptor.getTags().orElse(personToEdit.getTags());","lastModifiedDate":"2024-02-28"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);","lastModifiedDate":"2017-03-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":104,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-08"},{"lineNumber":105,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-08"},{"lineNumber":106,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-08"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-08"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (!(other instanceof EditCommand)) {","lastModifiedDate":"2017-05-08"},{"lineNumber":112,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":" EditCommand otherEditCommand \u003d (EditCommand) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":116,"author":{"gitId":"-"},"content":" return index.equals(otherEditCommand.index)","lastModifiedDate":"2023-07-13"},{"lineNumber":117,"author":{"gitId":"-"},"content":" \u0026\u0026 editPersonDescriptor.equals(otherEditCommand.editPersonDescriptor);","lastModifiedDate":"2023-07-13"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-08"},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" .add(\"index\", index)","lastModifiedDate":"2019-02-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" .add(\"editPersonDescriptor\", editPersonDescriptor)","lastModifiedDate":"2019-02-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":129,"author":{"gitId":"-"},"content":" * Stores the details to edit the person with. Each non-empty field value will replace the","lastModifiedDate":"2016-12-26"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * corresponding field value of the person.","lastModifiedDate":"2016-12-26"},{"lineNumber":131,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public static class EditPersonDescriptor {","lastModifiedDate":"2016-12-26"},{"lineNumber":133,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-06-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":135,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-06-21"},{"lineNumber":136,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-06-21"},{"lineNumber":137,"author":{"gitId":"aureliony"},"content":" private Tags tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public EditPersonDescriptor() {}","lastModifiedDate":"2016-12-26"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-01-11"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Copy constructor.","lastModifiedDate":"2018-01-11"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * A defensive copy of {@code tags} is used internally.","lastModifiedDate":"2018-01-11"},{"lineNumber":144,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-01-11"},{"lineNumber":145,"author":{"gitId":"-"},"content":" public EditPersonDescriptor(EditPersonDescriptor toCopy) {","lastModifiedDate":"2016-12-26"},{"lineNumber":146,"author":{"gitId":"-"},"content":" setName(toCopy.name);","lastModifiedDate":"2018-01-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" setPhone(toCopy.phone);","lastModifiedDate":"2018-01-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" setEmail(toCopy.email);","lastModifiedDate":"2018-01-15"},{"lineNumber":149,"author":{"gitId":"-"},"content":" setAddress(toCopy.address);","lastModifiedDate":"2018-01-15"},{"lineNumber":150,"author":{"gitId":"-"},"content":" setTags(toCopy.tags);","lastModifiedDate":"2018-01-11"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":153,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-26"},{"lineNumber":154,"author":{"gitId":"-"},"content":" * Returns true if at least one field is edited.","lastModifiedDate":"2016-12-26"},{"lineNumber":155,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-26"},{"lineNumber":156,"author":{"gitId":"-"},"content":" public boolean isAnyFieldEdited() {","lastModifiedDate":"2016-12-26"},{"lineNumber":157,"author":{"gitId":"-"},"content":" return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);","lastModifiedDate":"2018-08-14"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":160,"author":{"gitId":"-"},"content":" public void setName(Name name) {","lastModifiedDate":"2017-06-21"},{"lineNumber":161,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-06-21"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public Optional\u003cName\u003e getName() {","lastModifiedDate":"2016-12-26"},{"lineNumber":165,"author":{"gitId":"-"},"content":" return Optional.ofNullable(name);","lastModifiedDate":"2017-06-21"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":168,"author":{"gitId":"-"},"content":" public void setPhone(Phone phone) {","lastModifiedDate":"2017-06-21"},{"lineNumber":169,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-06-21"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":172,"author":{"gitId":"-"},"content":" public Optional\u003cPhone\u003e getPhone() {","lastModifiedDate":"2016-12-26"},{"lineNumber":173,"author":{"gitId":"-"},"content":" return Optional.ofNullable(phone);","lastModifiedDate":"2017-06-21"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":176,"author":{"gitId":"-"},"content":" public void setEmail(Email email) {","lastModifiedDate":"2017-06-21"},{"lineNumber":177,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-06-21"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":180,"author":{"gitId":"-"},"content":" public Optional\u003cEmail\u003e getEmail() {","lastModifiedDate":"2016-12-26"},{"lineNumber":181,"author":{"gitId":"-"},"content":" return Optional.ofNullable(email);","lastModifiedDate":"2017-06-21"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":184,"author":{"gitId":"-"},"content":" public void setAddress(Address address) {","lastModifiedDate":"2017-06-21"},{"lineNumber":185,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-06-21"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public Optional\u003cAddress\u003e getAddress() {","lastModifiedDate":"2016-12-26"},{"lineNumber":189,"author":{"gitId":"-"},"content":" return Optional.ofNullable(address);","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":"aureliony"},"content":" public void setTags(Tags tags) {","lastModifiedDate":"2024-02-28"},{"lineNumber":193,"author":{"gitId":"aureliony"},"content":" this.tags \u003d tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-26"},{"lineNumber":196,"author":{"gitId":"aureliony"},"content":" public Optional\u003cTags\u003e getTags() {","lastModifiedDate":"2024-02-28"},{"lineNumber":197,"author":{"gitId":"aureliony"},"content":" return Optional.ofNullable(tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":200,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-05-05"},{"lineNumber":201,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-05-05"},{"lineNumber":202,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2017-05-05"},{"lineNumber":203,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2017-05-05"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":206,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2017-05-05"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (!(other instanceof EditPersonDescriptor)) {","lastModifiedDate":"2017-05-05"},{"lineNumber":208,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2017-05-05"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":211,"author":{"gitId":"-"},"content":" EditPersonDescriptor otherEditPersonDescriptor \u003d (EditPersonDescriptor) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":212,"author":{"gitId":"-"},"content":" return Objects.equals(name, otherEditPersonDescriptor.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":213,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(phone, otherEditPersonDescriptor.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":214,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(email, otherEditPersonDescriptor.email)","lastModifiedDate":"2023-07-13"},{"lineNumber":215,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(address, otherEditPersonDescriptor.address)","lastModifiedDate":"2023-07-13"},{"lineNumber":216,"author":{"gitId":"-"},"content":" \u0026\u0026 Objects.equals(tags, otherEditPersonDescriptor.tags);","lastModifiedDate":"2023-07-13"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2019-02-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" .add(\"name\", name)","lastModifiedDate":"2019-02-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" .add(\"phone\", phone)","lastModifiedDate":"2019-02-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":" .add(\"email\", email)","lastModifiedDate":"2019-02-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-26"},{"lineNumber":230,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-26"}],"authorContributionMap":{"aureliony":11,"-":219}},{"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":"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":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-02-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-02-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2017-03-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-02-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2017-03-17"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new AddCommand object","lastModifiedDate":"2017-02-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class AddCommandParser implements Parser\u003cAddCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the AddCommand","lastModifiedDate":"2017-02-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * and returns an AddCommand object for execution.","lastModifiedDate":"2017-02-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public AddCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":35,"author":{"gitId":"-"},"content":" if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)","lastModifiedDate":"2017-12-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" || !argMultimap.getPreamble().isEmpty()) {","lastModifiedDate":"2017-12-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-03-11"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":41,"author":{"gitId":"-"},"content":" Name name \u003d ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Phone phone \u003d ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" Email email \u003d ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":44,"author":{"gitId":"-"},"content":" Address address \u003d ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());","lastModifiedDate":"2018-07-10"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" Tags tags \u003d ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" Person person \u003d new Person(name, phone, email, address, tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return new AddCommand(person);","lastModifiedDate":"2017-03-17"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-17"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Returns true if none of the prefixes contains empty {@code Optional} values in the given","lastModifiedDate":"2017-03-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * {@code ArgumentMultimap}.","lastModifiedDate":"2017-03-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {","lastModifiedDate":"2017-03-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return Stream.of(prefixes).allMatch(prefix -\u003e argumentMultimap.getValue(prefix).isPresent());","lastModifiedDate":"2017-03-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-02-05"}],"authorContributionMap":{"aureliony":7,"-":53}},{"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":"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":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2017-05-25"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-01-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-01-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-03-11"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-01-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * Parses input arguments and creates a new EditCommand object","lastModifiedDate":"2017-01-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"public class EditCommandParser implements Parser\u003cEditCommand\u003e {","lastModifiedDate":"2017-07-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-01-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Parses the given {@code String} of arguments in the context of the EditCommand","lastModifiedDate":"2017-01-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * and returns an EditCommand object for execution.","lastModifiedDate":"2017-01-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * @throws ParseException if the user input does not conform the expected format","lastModifiedDate":"2017-03-11"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public EditCommand parse(String args) throws ParseException {","lastModifiedDate":"2017-03-11"},{"lineNumber":32,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2017-05-15"},{"lineNumber":33,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d","lastModifiedDate":"2017-03-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);","lastModifiedDate":"2017-06-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2017-05-25"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2017-06-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2018-07-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE), pe);","lastModifiedDate":"2018-08-06"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);","lastModifiedDate":"2023-07-14"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" EditPersonDescriptor editPersonDescriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-01-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_NAME).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_PHONE).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" editPersonDescriptor.setPhone(ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":54,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":55,"author":{"gitId":"-"},"content":" editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {","lastModifiedDate":"2018-07-10"},{"lineNumber":58,"author":{"gitId":"-"},"content":" editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-07-10"},{"lineNumber":60,"author":{"gitId":"-"},"content":" parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":62,"author":{"gitId":"-"},"content":" if (!editPersonDescriptor.isAnyFieldEdited()) {","lastModifiedDate":"2017-01-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-03-11"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return new EditCommand(index, editPersonDescriptor);","lastModifiedDate":"2017-05-15"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2024-02-28"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Set\u003cTag\u003e} if {@code tags} is non-empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":71,"author":{"gitId":"-"},"content":" * If {@code tags} contain only one element which is an empty string, it will be parsed into a","lastModifiedDate":"2024-02-28"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * {@code Set\u003cTag\u003e} containing zero tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"aureliony"},"content":" private Optional\u003cTags\u003e parseTagsForEdit(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2024-02-28"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assert tags !\u003d null;","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":77,"author":{"gitId":"-"},"content":" if (tags.isEmpty()) {","lastModifiedDate":"2024-02-28"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2024-02-28"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Collection\u003cString\u003e tagSet \u003d tags.size() \u003d\u003d 1 \u0026\u0026 tags.contains(\"\") ? Collections.emptySet() : tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return Optional.of(ParserUtil.parseTags(tagSet));","lastModifiedDate":"2024-02-28"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":84,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-26"}],"authorContributionMap":{"aureliony":2,"-":82}},{"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":"","lastModifiedDate":"2017-02-11"},{"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.StringUtil;","lastModifiedDate":"2017-02-11"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-02-11"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains utility methods used for parsing strings in the various *Parser classes.","lastModifiedDate":"2017-07-18"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class ParserUtil {","lastModifiedDate":"2017-02-11"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String MESSAGE_INVALID_INDEX \u003d \"Index is not a non-zero unsigned integer.\";","lastModifiedDate":"2017-06-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-02-11"},{"lineNumber":24,"author":{"gitId":"-"},"content":" * Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be","lastModifiedDate":"2017-05-25"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * trimmed.","lastModifiedDate":"2017-05-25"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * @throws ParseException if the specified index is invalid (not non-zero unsigned integer).","lastModifiedDate":"2018-07-10"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static Index parseIndex(String oneBasedIndex) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" String trimmedIndex \u003d oneBasedIndex.trim();","lastModifiedDate":"2017-05-25"},{"lineNumber":30,"author":{"gitId":"-"},"content":" if (!StringUtil.isNonZeroUnsignedInteger(trimmedIndex)) {","lastModifiedDate":"2017-06-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_INVALID_INDEX);","lastModifiedDate":"2018-07-10"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return Index.fromOneBased(Integer.parseInt(trimmedIndex));","lastModifiedDate":"2017-05-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-02-11"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Parses a {@code String name} into a {@code Name}.","lastModifiedDate":"2017-05-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code name} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static Name parseName(String name) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":" String trimmedName \u003d name.trim();","lastModifiedDate":"2017-05-29"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return new Name(trimmedName);","lastModifiedDate":"2017-05-29"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-05-30"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * Parses a {@code String phone} into a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":55,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code phone} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":57,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static Phone parsePhone(String phone) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":59,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-30"},{"lineNumber":60,"author":{"gitId":"-"},"content":" String trimmedPhone \u003d phone.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"-"},"content":" return new Phone(trimmedPhone);","lastModifiedDate":"2017-05-30"},{"lineNumber":63,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","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":" * Parses a {@code String address} into an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * Leading and trailing whitespaces will be trimmed.","lastModifiedDate":"2017-05-30"},{"lineNumber":71,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-05-30"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * @throws ParseException if the given {@code address} is invalid.","lastModifiedDate":"2018-07-10"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-30"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static Address parseAddress(String address) throws ParseException {","lastModifiedDate":"2018-07-10"},{"lineNumber":75,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-30"},{"lineNumber":76,"author":{"gitId":"-"},"content":" String trimmedAddress \u003d address.trim();","lastModifiedDate":"2017-05-30"},{"lineNumber":77,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"-"},"content":" return new Address(trimmedAddress);","lastModifiedDate":"2017-05-30"},{"lineNumber":79,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"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":"aureliony"},"content":" try {","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return new Email(trimmedEmail);","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","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":"aureliony"},"content":" * Parses {@code Collection\u003cString\u003e tags} into a {@code Tags}.","lastModifiedDate":"2024-02-28"},{"lineNumber":102,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-02-11"},{"lineNumber":103,"author":{"gitId":"aureliony"},"content":" public static Tags parseTags(Collection\u003cString\u003e tags) throws ParseException {","lastModifiedDate":"2024-02-28"},{"lineNumber":104,"author":{"gitId":"-"},"content":" requireNonNull(tags);","lastModifiedDate":"2017-05-15"},{"lineNumber":105,"author":{"gitId":"aureliony"},"content":" try {","lastModifiedDate":"2024-02-28"},{"lineNumber":106,"author":{"gitId":"aureliony"},"content":" return new Tags(tags.toArray(new String[0]));","lastModifiedDate":"2024-02-28"},{"lineNumber":107,"author":{"gitId":"aureliony"},"content":" } catch (IllegalArgumentException e) {","lastModifiedDate":"2024-02-28"},{"lineNumber":108,"author":{"gitId":"aureliony"},"content":" throw new ParseException(e.getMessage());","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-02-11"},{"lineNumber":111,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":112,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"aureliony":24,"-":88}},{"path":"src/main/java/seedu/address/model/person/NameContainsKeywordsPredicate.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2017-06-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.function.Predicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.StringUtil;","lastModifiedDate":"2017-06-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Tests that a {@code Person}\u0027s {@code Name} matches any of the keywords given.","lastModifiedDate":"2018-01-10"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class NameContainsKeywordsPredicate implements Predicate\u003cPerson\u003e {","lastModifiedDate":"2018-01-10"},{"lineNumber":13,"author":{"gitId":"-"},"content":" private final List\u003cString\u003e keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public NameContainsKeywordsPredicate(List\u003cString\u003e keywords) {","lastModifiedDate":"2017-06-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" this.keywords \u003d keywords;","lastModifiedDate":"2017-06-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public boolean test(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return keywords.stream()","lastModifiedDate":"2017-06-12"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" .anyMatch(keyword -\u003e StringUtil.containsWordIgnoreCase(person.getName().toString(), keyword));","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2017-06-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (!(other instanceof NameContainsKeywordsPredicate)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":36,"author":{"gitId":"-"},"content":" NameContainsKeywordsPredicate otherNameContainsKeywordsPredicate \u003d (NameContainsKeywordsPredicate) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return keywords.equals(otherNameContainsKeywordsPredicate.keywords);","lastModifiedDate":"2023-07-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new ToStringBuilder(this).add(\"keywords\", keywords).toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-12"}],"authorContributionMap":{"aureliony":1,"-":43}},{"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.Objects;","lastModifiedDate":"2017-01-19"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonCreator;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonProperty;","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2019-02-23"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Represents a Person in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2017-12-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class Person {","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // Identity fields","lastModifiedDate":"2018-04-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private final Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private final Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private final Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // Data fields","lastModifiedDate":"2018-04-19"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final Address address;","lastModifiedDate":"2018-04-19"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" private final Tags tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Every field must be present and not null.","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" public Person(Name name, Phone phone, Email email, Address address, Tags tags) {","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"-"},"content":" requireAllNonNull(name, phone, email, address, tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.name \u003d name;","lastModifiedDate":"2017-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.phone \u003d phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.email \u003d email;","lastModifiedDate":"2017-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.address \u003d address;","lastModifiedDate":"2017-12-20"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":" this.tags \u003d tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" @JsonCreator","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" private Person(@JsonProperty(\"name\") String name, @JsonProperty(\"phone\") String phone,","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" @JsonProperty(\"email\") String email, @JsonProperty(\"address\") String address,","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" @JsonProperty(\"tags\") String[] tagNames) {","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" requireAllNonNull(name, phone, email, address, tagNames);","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2024-02-27"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2024-02-27"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2024-02-27"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2024-02-27"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" this.tags \u003d new Tags(tagNames);","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-27"},{"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":"aureliony"},"content":" public Tags getTags() {","lastModifiedDate":"2024-02-28"},{"lineNumber":73,"author":{"gitId":"aureliony"},"content":" return tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":74,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":76,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same name.","lastModifiedDate":"2020-12-18"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * This defines a weaker notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":79,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public boolean isSamePerson(Person otherPerson) {","lastModifiedDate":"2018-04-19"},{"lineNumber":81,"author":{"gitId":"-"},"content":" if (otherPerson \u003d\u003d this) {","lastModifiedDate":"2018-04-19"},{"lineNumber":82,"author":{"gitId":"-"},"content":" return true;","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":" return otherPerson !\u003d null","lastModifiedDate":"2018-04-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u0026\u0026 otherPerson.getName().equals(getName());","lastModifiedDate":"2020-12-18"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Returns true if both persons have the same identity and data fields.","lastModifiedDate":"2018-04-19"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * This defines a stronger notion of equality between two persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":92,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":93,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":95,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-01-10"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":99,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (!(other instanceof Person)) {","lastModifiedDate":"2018-01-10"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-01-10"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-01-10"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-10"},{"lineNumber":104,"author":{"gitId":"-"},"content":" Person otherPerson \u003d (Person) other;","lastModifiedDate":"2018-01-10"},{"lineNumber":105,"author":{"gitId":"-"},"content":" return name.equals(otherPerson.name)","lastModifiedDate":"2023-07-13"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \u0026\u0026 phone.equals(otherPerson.phone)","lastModifiedDate":"2023-07-13"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \u0026\u0026 email.equals(otherPerson.email)","lastModifiedDate":"2023-07-13"},{"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":"-"},"content":" return Objects.hash(name, phone, email, address, tags);","lastModifiedDate":"2016-08-24"},{"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":"-"},"content":" .add(\"address\", address)","lastModifiedDate":"2019-02-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .add(\"tags\", tags)","lastModifiedDate":"2019-02-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .toString();","lastModifiedDate":"2019-02-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":129,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":22,"-":107}},{"path":"src/main/java/seedu/address/model/person/UniquePersonList.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.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2018-01-10"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-15"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Iterator;","lastModifiedDate":"2017-01-19"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-01-19"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-19"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.databind.annotation.JsonDeserialize;","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import javafx.collections.FXCollections;","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import javafx.collections.ObservableList;","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import seedu.address.model.person.exceptions.DuplicatePersonException;","lastModifiedDate":"2017-06-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.person.exceptions.PersonNotFoundException;","lastModifiedDate":"2017-06-09"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":"import seedu.address.storage.UniquePersonListDeserializer;","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * A list of persons that enforces uniqueness between its elements and does not allow nulls.","lastModifiedDate":"2016-09-22"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * A person is considered unique by comparing using {@code Person#isSamePerson(Person)}. As such, adding and updating of","lastModifiedDate":"2018-04-19"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * persons uses Person#isSamePerson(Person) for equality so as to ensure that the person being added or updated is","lastModifiedDate":"2018-04-19"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * unique in terms of identity in the UniquePersonList. However, the removal of a person uses Person#equals(Object) so","lastModifiedDate":"2018-04-19"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * as to ensure that the person with exactly the same fields will be removed.","lastModifiedDate":"2018-04-19"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Supports a minimal set of list operations.","lastModifiedDate":"2016-09-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @see Person#isSamePerson(Person)","lastModifiedDate":"2018-04-19"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":"@JsonDeserialize(using \u003d UniquePersonListDeserializer.class)","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":"public class UniquePersonList implements Iterable\u003cPerson\u003e {","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private final ObservableList\u003cPerson\u003e internalList \u003d FXCollections.observableArrayList();","lastModifiedDate":"2016-10-19"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Returns true if the list contains an equivalent person as the given argument.","lastModifiedDate":"2016-09-22"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public boolean contains(Person toCheck) {","lastModifiedDate":"2018-01-10"},{"lineNumber":38,"author":{"gitId":"-"},"content":" requireNonNull(toCheck);","lastModifiedDate":"2017-05-15"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return internalList.stream().anyMatch(toCheck::isSamePerson);","lastModifiedDate":"2018-04-19"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Adds a person to the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * The person must not already exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public void add(Person toAdd) {","lastModifiedDate":"2018-08-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":" requireNonNull(toAdd);","lastModifiedDate":"2017-05-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (contains(toAdd)) {","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" internalList.add(toAdd);","lastModifiedDate":"2018-01-10"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Replaces the person {@code target} in the list with {@code editedPerson}.","lastModifiedDate":"2017-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * {@code target} must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * The person identity of {@code editedPerson} must not be the same as another existing person in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public void setPerson(Person target, Person editedPerson) {","lastModifiedDate":"2018-08-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":" requireAllNonNull(target, editedPerson);","lastModifiedDate":"2018-08-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" int index \u003d internalList.indexOf(target);","lastModifiedDate":"2017-06-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":" if (index \u003d\u003d -1) {","lastModifiedDate":"2017-06-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2017-06-07"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" if (!target.isSamePerson(editedPerson) \u0026\u0026 contains(editedPerson)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":68,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2016-12-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" internalList.set(index, editedPerson);","lastModifiedDate":"2018-01-10"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-13"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Removes the equivalent person from the list.","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * The person must exist in the list.","lastModifiedDate":"2018-08-07"},{"lineNumber":77,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public void remove(Person toRemove) {","lastModifiedDate":"2018-08-07"},{"lineNumber":79,"author":{"gitId":"-"},"content":" requireNonNull(toRemove);","lastModifiedDate":"2017-05-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" if (!internalList.remove(toRemove)) {","lastModifiedDate":"2018-02-28"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new PersonNotFoundException();","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public void setPersons(UniquePersonList replacement) {","lastModifiedDate":"2016-10-19"},{"lineNumber":86,"author":{"gitId":"-"},"content":" requireNonNull(replacement);","lastModifiedDate":"2018-08-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":" internalList.setAll(replacement.internalList);","lastModifiedDate":"2018-08-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-10-19"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-10-19"},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-07"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Replaces the contents of this list with {@code persons}.","lastModifiedDate":"2018-08-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":" * {@code persons} must not contain duplicate persons.","lastModifiedDate":"2018-08-07"},{"lineNumber":93,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":" public void setPersons(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-08-07"},{"lineNumber":95,"author":{"gitId":"-"},"content":" requireAllNonNull(persons);","lastModifiedDate":"2018-01-10"},{"lineNumber":96,"author":{"gitId":"-"},"content":" if (!personsAreUnique(persons)) {","lastModifiedDate":"2018-04-19"},{"lineNumber":97,"author":{"gitId":"-"},"content":" throw new DuplicatePersonException();","lastModifiedDate":"2018-01-21"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-21"},{"lineNumber":100,"author":{"gitId":"-"},"content":" internalList.setAll(persons);","lastModifiedDate":"2018-08-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-24"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-24"},{"lineNumber":103,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-09-01"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * Returns the backing list as an unmodifiable {@code ObservableList}.","lastModifiedDate":"2017-09-01"},{"lineNumber":105,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-09-01"},{"lineNumber":106,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-26"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public ObservableList\u003cPerson\u003e asUnmodifiableObservableList() {","lastModifiedDate":"2018-04-05"},{"lineNumber":108,"author":{"gitId":"aureliony"},"content":" return FXCollections.unmodifiableObservableList(internalList);","lastModifiedDate":"2024-02-27"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-22"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-22"},{"lineNumber":111,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":112,"author":{"gitId":"-"},"content":" public Iterator\u003cPerson\u003e iterator() {","lastModifiedDate":"2016-08-24"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return internalList.iterator();","lastModifiedDate":"2016-08-24"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-09-21"},{"lineNumber":118,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":122,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":123,"author":{"gitId":"-"},"content":" if (!(other instanceof UniquePersonList)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":124,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":127,"author":{"gitId":"-"},"content":" UniquePersonList otherUniquePersonList \u003d (UniquePersonList) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":128,"author":{"gitId":"-"},"content":" return internalList.equals(otherUniquePersonList.internalList);","lastModifiedDate":"2023-07-13"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-09-21"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-09-21"},{"lineNumber":133,"author":{"gitId":"-"},"content":" return internalList.hashCode();","lastModifiedDate":"2016-09-21"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-21"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-04-19"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2019-02-24"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2019-02-24"},{"lineNumber":138,"author":{"gitId":"-"},"content":" return internalList.toString();","lastModifiedDate":"2019-02-24"},{"lineNumber":139,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-24"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-24"},{"lineNumber":141,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-04-19"},{"lineNumber":142,"author":{"gitId":"-"},"content":" * Returns true if {@code persons} contains only unique persons.","lastModifiedDate":"2018-04-19"},{"lineNumber":143,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-04-19"},{"lineNumber":144,"author":{"gitId":"-"},"content":" private boolean personsAreUnique(List\u003cPerson\u003e persons) {","lastModifiedDate":"2018-04-19"},{"lineNumber":145,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c persons.size() - 1; i++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":146,"author":{"gitId":"-"},"content":" for (int j \u003d i + 1; j \u003c persons.size(); j++) {","lastModifiedDate":"2018-04-19"},{"lineNumber":147,"author":{"gitId":"-"},"content":" if (persons.get(i).isSamePerson(persons.get(j))) {","lastModifiedDate":"2018-04-19"},{"lineNumber":148,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2018-04-19"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":152,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2018-04-19"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-04-19"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":7,"-":147}},{"path":"src/main/java/seedu/address/model/person/fields/Address.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s address in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Address implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d \"Addresses can take any values, and it should not be blank\";","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" private final String address;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Constructs an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @param address A valid address.","lastModifiedDate":"2017-05-30"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public Address(String address) {","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-15"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(address), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" this.address \u003d address;","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }","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":" * Returns true if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" return address;","lastModifiedDate":"2024-02-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"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":"-"},"content":" if (!(other instanceof Address)) {","lastModifiedDate":"2023-07-13"},{"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":"-"},"content":" Address otherAddress \u003d (Address) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" return address.equals(otherAddress.address);","lastModifiedDate":"2024-02-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"aureliony"},"content":" return address.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":14,"-":54}},{"path":"src/main/java/seedu/address/model/person/fields/Email.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s email in the address book.","lastModifiedDate":"2018-02-09"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Email implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2021-07-20"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2018-02-09"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2021-07-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"characters.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":20,"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":21,"author":{"gitId":"-"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":23,"author":{"gitId":"-"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2021-07-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" // alphanumeric and special characters","lastModifiedDate":"2018-02-09"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2021-07-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2021-07-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2021-07-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":32,"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":33,"author":{"gitId":"-"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" private final String email;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Constructs an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":40,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * @param email A valid email address.","lastModifiedDate":"2017-05-30"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public Email(String email) {","lastModifiedDate":"2024-02-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-15"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(email), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" this.email \u003d email;","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" * Returns if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"aureliony"},"content":" return email;","lastModifiedDate":"2024-02-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" if (!(other instanceof Email)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return false;","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":" Email otherEmail \u003d (Email) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":74,"author":{"gitId":"aureliony"},"content":" return email.equals(otherEmail.email);","lastModifiedDate":"2024-02-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":79,"author":{"gitId":"aureliony"},"content":" return email.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":13,"-":69}},{"path":"src/main/java/seedu/address/model/person/fields/Field.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"/**","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":" * Represents an interface for Person fields.","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"public interface Field {","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"aureliony":8}},{"path":"src/main/java/seedu/address/model/person/fields/Name.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s name in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Name implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2018-04-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" private final String name;","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Constructs a {@code Name}.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @param name A valid name.","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Name(String name) {","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" requireNonNull(name);","lastModifiedDate":"2017-05-15"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(name), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" this.name \u003d name;","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid name.","lastModifiedDate":"2018-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" return name;","lastModifiedDate":"2024-02-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" if (!(other instanceof Name)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Name otherName \u003d (Name) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":" return name.equals(otherName.name);","lastModifiedDate":"2024-02-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"aureliony"},"content":" return name.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":14,"-":55}},{"path":"src/main/java/seedu/address/model/person/fields/Phone.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Person\u0027s phone number in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"public class Phone implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Phone numbers should only contain numbers, and it should be at least 3 digits long\";","lastModifiedDate":"2018-04-04"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"\\\\d{3,}\";","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" private final String phone;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Constructs a {@code Phone}.","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param phone A valid phone number.","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Phone(String phone) {","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(phone);","lastModifiedDate":"2017-05-15"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(phone), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" this.phone \u003d phone;","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid phone number.","lastModifiedDate":"2018-04-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-27"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" return phone;","lastModifiedDate":"2024-02-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!(other instanceof Phone)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return false;","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":" Phone otherPhone \u003d (Phone) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" return phone.equals(otherPhone.phone);","lastModifiedDate":"2024-02-27"},{"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 int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" return phone.hashCode();","lastModifiedDate":"2024-02-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":14,"-":49}},{"path":"src/main/java/seedu/address/model/person/fields/Tags.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import java.util.Set;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import java.util.stream.Collectors;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"import java.util.stream.Stream;","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"/**","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":" * Represents an abstraction for a list of tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"public class Tags implements Field {","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" private final Set\u003cTag\u003e tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" /**","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" * Constructs a new Tags from a list of tags.","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" * @param tags A list of tags, or null.","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" public Tags(Tag... tags) {","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" this.tags \u003d Stream.of(tags)","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" .collect(Collectors.toUnmodifiableSet());","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" /**","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" * Constructs a new Tags from a list of strings.","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" * @param tagNames A list of strings, or null.","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" public Tags(String... tagNames) {","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" this.tags \u003d Stream.of(tagNames)","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" .map(Tag::new)","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" .collect(Collectors.toUnmodifiableSet());","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-28"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" private Set\u003cTag\u003e get() {","lastModifiedDate":"2024-02-28"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" return tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"aureliony"},"content":" public Stream\u003cTag\u003e stream() {","lastModifiedDate":"2024-02-28"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" return tags.stream();","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" public String toString() {","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" return tags.toString();","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"aureliony"},"content":" return true;","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-02-28"},{"lineNumber":58,"author":{"gitId":"aureliony"},"content":" if (!(other instanceof Tags)) {","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"aureliony"},"content":" return false;","lastModifiedDate":"2024-02-28"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":62,"author":{"gitId":"aureliony"},"content":" Tags otherTags \u003d (Tags) other;","lastModifiedDate":"2024-02-28"},{"lineNumber":63,"author":{"gitId":"aureliony"},"content":" return tags.equals(otherTags.tags);","lastModifiedDate":"2024-02-28"},{"lineNumber":64,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":65,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":66,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-28"},{"lineNumber":67,"author":{"gitId":"aureliony"},"content":" public int hashCode() {","lastModifiedDate":"2024-02-28"},{"lineNumber":68,"author":{"gitId":"aureliony"},"content":" return tags.hashCode();","lastModifiedDate":"2024-02-28"},{"lineNumber":69,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":70,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":71,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"aureliony":71}},{"path":"src/main/java/seedu/address/model/tag/Tag.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.tag;","lastModifiedDate":"2016-09-21"},{"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":"aureliony"},"content":"import com.fasterxml.jackson.annotation.JsonValue;","lastModifiedDate":"2024-02-26"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Represents a Tag in the address book.","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class Tag {","lastModifiedDate":"2016-08-24"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final String MESSAGE_CONSTRAINTS \u003d \"Tags names should be alphanumeric\";","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" private static final String VALIDATION_REGEX \u003d \"\\\\p{Alnum}+\";","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" private final String tagName;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":19,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Constructs a {@code Tag}.","lastModifiedDate":"2017-05-30"},{"lineNumber":21,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * @param tagName A valid tag name.","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public Tag(String tagName) {","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" requireNonNull(tagName);","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" tagName \u003d tagName.trim();","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" checkArgument(isValid(tagName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":" this.tagName \u003d tagName;","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" @JsonValue","lastModifiedDate":"2024-02-26"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" public String get() {","lastModifiedDate":"2024-02-26"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" return tagName;","lastModifiedDate":"2024-02-26"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-26"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid tag name.","lastModifiedDate":"2016-09-22"},{"lineNumber":38,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" private static boolean isValid(String test) {","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" if (!(other instanceof Tag)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return false;","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":" Tag otherTag \u003d (Tag) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return tagName.equals(otherTag.tagName);","lastModifiedDate":"2023-07-13"},{"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 int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" return tagName.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Format state as text for viewing.","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return \u0027[\u0027 + tagName + \u0027]\u0027;","lastModifiedDate":"2016-08-24"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"aureliony":13,"-":57}},{"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 seedu.address.model.AddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2016-12-20"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2016-12-20"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Contains utility methods for populating {@code AddressBook} with sample data.","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class SampleDataUtil {","lastModifiedDate":"2016-12-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static Person[] getSamplePersons() {","lastModifiedDate":"2016-12-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" return new Person[] {","lastModifiedDate":"2016-12-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":" new Person(new Name(\"Alex Yeoh\"), new Phone(\"87438807\"), new Email(\"alexyeoh@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Geylang Street 29, #06-40\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" getTagSet(\"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":21,"author":{"gitId":"-"},"content":" new Person(new Name(\"Bernice Yu\"), new Phone(\"99272758\"), new Email(\"berniceyu@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" new Address(\"Blk 30 Lorong 3 Serangoon Gardens, #07-18\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\", \"friends\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":24,"author":{"gitId":"-"},"content":" new Person(new Name(\"Charlotte Oliveiro\"), new Phone(\"93210283\"), new Email(\"charlotte@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" new Address(\"Blk 11 Ang Mo Kio Street 74, #11-04\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" getTagSet(\"neighbours\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new Person(new Name(\"David Li\"), new Phone(\"91031282\"), new Email(\"lidavid@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" new Address(\"Blk 436 Serangoon Gardens Street 26, #16-43\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" getTagSet(\"family\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":" new Person(new Name(\"Irfan Ibrahim\"), new Phone(\"92492021\"), new Email(\"irfan@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" new Address(\"Blk 47 Tampines Street 20, #17-35\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":" getTagSet(\"classmates\")),","lastModifiedDate":"2017-03-14"},{"lineNumber":33,"author":{"gitId":"-"},"content":" new Person(new Name(\"Roy Balakrishnan\"), new Phone(\"92624417\"), new Email(\"royb@example.com\"),","lastModifiedDate":"2017-04-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new Address(\"Blk 45 Aljunied Street 85, #11-31\"),","lastModifiedDate":"2016-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" getTagSet(\"colleagues\"))","lastModifiedDate":"2017-03-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" };","lastModifiedDate":"2016-12-20"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-20"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static ReadOnlyAddressBook getSampleAddressBook() {","lastModifiedDate":"2016-12-20"},{"lineNumber":40,"author":{"gitId":"-"},"content":" AddressBook sampleAb \u003d new AddressBook();","lastModifiedDate":"2017-04-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":" for (Person samplePerson : getSamplePersons()) {","lastModifiedDate":"2016-12-20"},{"lineNumber":42,"author":{"gitId":"-"},"content":" sampleAb.addPerson(samplePerson);","lastModifiedDate":"2017-04-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" return sampleAb;","lastModifiedDate":"2017-04-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-14"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Returns a tag set containing the list of strings given.","lastModifiedDate":"2017-03-14"},{"lineNumber":49,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-14"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" public static Tags getTagSet(String... strings) {","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" return new Tags(strings);","lastModifiedDate":"2024-02-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-03-14"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-14"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-12-20"}],"authorContributionMap":{"aureliony":7,"-":47}},{"path":"src/main/java/seedu/address/storage/JsonAddressBookStorage.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 static java.util.Objects.requireNonNull;","lastModifiedDate":"2018-08-13"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.IOException;","lastModifiedDate":"2018-08-13"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-08-13"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;","lastModifiedDate":"2018-08-13"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;","lastModifiedDate":"2018-08-13"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.LogsCenter;","lastModifiedDate":"2018-08-13"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.commons.exceptions.DataLoadingException;","lastModifiedDate":"2023-06-14"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.FileUtil;","lastModifiedDate":"2018-08-13"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.commons.util.JsonUtil;","lastModifiedDate":"2018-08-13"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2024-02-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import seedu.address.model.ReadOnlyAddressBook;","lastModifiedDate":"2018-08-13"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2018-08-13"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * A class to access AddressBook data stored as a json file on the hard disk.","lastModifiedDate":"2018-08-13"},{"lineNumber":19,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class JsonAddressBookStorage implements AddressBookStorage {","lastModifiedDate":"2018-08-13"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsCenter.getLogger(JsonAddressBookStorage.class);","lastModifiedDate":"2018-08-13"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" private final Path filePath;","lastModifiedDate":"2024-02-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public JsonAddressBookStorage(Path filePath) {","lastModifiedDate":"2018-08-13"},{"lineNumber":27,"author":{"gitId":"-"},"content":" this.filePath \u003d filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public Path getAddressBookFilePath() {","lastModifiedDate":"2018-08-13"},{"lineNumber":31,"author":{"gitId":"-"},"content":" return filePath;","lastModifiedDate":"2018-08-13"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook() throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return readAddressBook(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Similar to {@link #readAddressBook()}.","lastModifiedDate":"2018-08-13"},{"lineNumber":41,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * @throws DataLoadingException if loading the data from storage failed.","lastModifiedDate":"2023-06-15"},{"lineNumber":44,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public Optional\u003cReadOnlyAddressBook\u003e readAddressBook(Path filePath) throws DataLoadingException {","lastModifiedDate":"2023-06-14"},{"lineNumber":46,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" Optional\u003cAddressBook\u003e addressBook \u003d JsonUtil.readJsonFile(filePath, AddressBook.class);","lastModifiedDate":"2024-02-26"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" if (!addressBook.isPresent()) {","lastModifiedDate":"2024-02-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return Optional.empty();","lastModifiedDate":"2018-08-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" return Optional.of(addressBook.get());","lastModifiedDate":"2024-02-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2018-08-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" saveAddressBook(addressBook, filePath);","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":" /**","lastModifiedDate":"2018-08-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * Similar to {@link #saveAddressBook(ReadOnlyAddressBook)}.","lastModifiedDate":"2018-08-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2018-08-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * @param filePath location of the data. Cannot be null.","lastModifiedDate":"2018-08-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-08-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException {","lastModifiedDate":"2018-08-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" requireNonNull(addressBook);","lastModifiedDate":"2018-08-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" requireNonNull(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" FileUtil.createIfMissing(filePath);","lastModifiedDate":"2018-08-13"},{"lineNumber":70,"author":{"gitId":"aureliony"},"content":" JsonUtil.saveJsonFile(addressBook, filePath);","lastModifiedDate":"2024-02-26"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-13"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-13"},{"lineNumber":73,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2018-08-13"}],"authorContributionMap":{"aureliony":6,"-":67}},{"path":"src/main/java/seedu/address/storage/UniquePersonListDeserializer.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.storage;","lastModifiedDate":"2024-02-27"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import java.io.IOException;","lastModifiedDate":"2024-02-27"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import java.util.List;","lastModifiedDate":"2024-02-27"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.core.JsonParser;","lastModifiedDate":"2024-02-27"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.core.JsonProcessingException;","lastModifiedDate":"2024-02-27"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.databind.DeserializationContext;","lastModifiedDate":"2024-02-27"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import com.fasterxml.jackson.databind.deser.std.StdDeserializer;","lastModifiedDate":"2024-02-27"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-27"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.UniquePersonList;","lastModifiedDate":"2024-02-27"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"/**","lastModifiedDate":"2024-02-27"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" * Implements a custom deserializer for UniquePersonList,","lastModifiedDate":"2024-02-27"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" * as Jackson does not support JavaFX collections.","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-02-27"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"public class UniquePersonListDeserializer extends StdDeserializer\u003cUniquePersonList\u003e {","lastModifiedDate":"2024-02-27"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" public UniquePersonListDeserializer() {","lastModifiedDate":"2024-02-27"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" this(null);","lastModifiedDate":"2024-02-27"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" public UniquePersonListDeserializer(Class\u003c?\u003e vc) {","lastModifiedDate":"2024-02-27"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" super(vc);","lastModifiedDate":"2024-02-27"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" @Override","lastModifiedDate":"2024-02-27"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" public UniquePersonList deserialize(JsonParser parser,","lastModifiedDate":"2024-02-27"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" DeserializationContext context) throws IOException, JsonProcessingException {","lastModifiedDate":"2024-02-27"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" List\u003cPerson\u003e persons \u003d context.readValue(parser,","lastModifiedDate":"2024-02-27"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" context.getTypeFactory().constructCollectionType(List.class, Person.class));","lastModifiedDate":"2024-02-27"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" UniquePersonList upl \u003d new UniquePersonList();","lastModifiedDate":"2024-02-27"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" upl.setPersons(persons);","lastModifiedDate":"2024-02-27"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" return upl;","lastModifiedDate":"2024-02-27"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-27"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-27"}],"authorContributionMap":{"aureliony":38}},{"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":"aureliony"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-08-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * An UI component that displays information of a {@code Person}.","lastModifiedDate":"2017-08-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-08-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonCard extends UiPart\u003cRegion\u003e {","lastModifiedDate":"2016-12-24"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String FXML \u003d \"PersonListCard.fxml\";","lastModifiedDate":"2016-09-21"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-03-25"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Note: Certain keywords such as \"location\" and \"resources\" are reserved keywords in JavaFX.","lastModifiedDate":"2017-03-25"},{"lineNumber":22,"author":{"gitId":"-"},"content":" * As a consequence, UI elements\u0027 variable names cannot be set to such keywords","lastModifiedDate":"2017-03-25"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * or an exception will be thrown by JavaFX during runtime.","lastModifiedDate":"2017-03-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2017-03-25"},{"lineNumber":25,"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":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-03-25"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-03-25"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public final Person person;","lastModifiedDate":"2018-01-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private HBox cardPane;","lastModifiedDate":"2016-09-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private Label name;","lastModifiedDate":"2016-09-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private Label id;","lastModifiedDate":"2016-09-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private Label phone;","lastModifiedDate":"2016-09-21"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private Label address;","lastModifiedDate":"2016-09-21"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private Label email;","lastModifiedDate":"2016-09-21"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @FXML","lastModifiedDate":"2016-09-21"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private FlowPane tags;","lastModifiedDate":"2016-12-18"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-21"},{"lineNumber":45,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * Creates a {@code PersonCode} with the given {@code Person} and index to display.","lastModifiedDate":"2020-05-27"},{"lineNumber":47,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2018-01-10"},{"lineNumber":49,"author":{"gitId":"-"},"content":" super(FXML);","lastModifiedDate":"2016-12-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" this.person \u003d person;","lastModifiedDate":"2017-07-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" id.setText(displayedIndex + \". \");","lastModifiedDate":"2016-09-21"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" name.setText(person.getName().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" phone.setText(person.getPhone().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":54,"author":{"gitId":"aureliony"},"content":" address.setText(person.getAddress().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" email.setText(person.getEmail().toString());","lastModifiedDate":"2024-02-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":" person.getTags().stream()","lastModifiedDate":"2019-01-02"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" .sorted(Comparator.comparing(Tag::get))","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"aureliony"},"content":" .forEach(tag -\u003e tags.getChildren().add(new Label(tag.get())));","lastModifiedDate":"2024-02-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-18"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-21"}],"authorContributionMap":{"aureliony":8,"-":53}},{"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":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-07-05"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-07-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.ArrayList;","lastModifiedDate":"2017-06-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-07-20"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;","lastModifiedDate":"2017-06-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.index.Index;","lastModifiedDate":"2018-01-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.exceptions.CommandException;","lastModifiedDate":"2017-06-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2017-06-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2017-06-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-07-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-06-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Contains helper methods for testing commands.","lastModifiedDate":"2017-06-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"public class CommandTestUtil {","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_AMY \u003d \"Amy Bee\";","lastModifiedDate":"2017-07-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public static final String VALID_NAME_BOB \u003d \"Bob Choo\";","lastModifiedDate":"2017-07-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_AMY \u003d \"11111111\";","lastModifiedDate":"2017-07-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static final String VALID_PHONE_BOB \u003d \"22222222\";","lastModifiedDate":"2017-07-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_AMY \u003d \"amy@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":" public static final String VALID_EMAIL_BOB \u003d \"bob@example.com\";","lastModifiedDate":"2017-07-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_AMY \u003d \"Block 312, Amy Street 1\";","lastModifiedDate":"2017-07-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public static final String VALID_ADDRESS_BOB \u003d \"Block 123, Bobby Street 3\";","lastModifiedDate":"2017-07-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_HUSBAND \u003d \"husband\";","lastModifiedDate":"2017-07-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public static final String VALID_TAG_FRIEND \u003d \"friend\";","lastModifiedDate":"2017-07-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_AMY \u003d \" \" + PREFIX_NAME + VALID_NAME_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static final String NAME_DESC_BOB \u003d \" \" + PREFIX_NAME + VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_AMY \u003d \" \" + PREFIX_PHONE + VALID_PHONE_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public static final String PHONE_DESC_BOB \u003d \" \" + PREFIX_PHONE + VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_AMY \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public static final String EMAIL_DESC_BOB \u003d \" \" + PREFIX_EMAIL + VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_AMY \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static final String ADDRESS_DESC_BOB \u003d \" \" + PREFIX_ADDRESS + VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_FRIEND \u003d \" \" + PREFIX_TAG + VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public static final String TAG_DESC_HUSBAND \u003d \" \" + PREFIX_TAG + VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":51,"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":52,"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":53,"author":{"gitId":"-"},"content":" public static final String INVALID_EMAIL_DESC \u003d \" \" + PREFIX_EMAIL + \"bob!yahoo\"; // missing \u0027@\u0027 symbol","lastModifiedDate":"2017-07-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final String INVALID_ADDRESS_DESC \u003d \" \" + PREFIX_ADDRESS; // empty string not allowed for addresses","lastModifiedDate":"2017-07-05"},{"lineNumber":55,"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":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_WHITESPACE \u003d \"\\t \\r \\n\";","lastModifiedDate":"2017-12-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String PREAMBLE_NON_EMPTY \u003d \"NonEmptyPreamble\";","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final EditCommand.EditPersonDescriptor DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":63,"author":{"gitId":"-"},"content":" static {","lastModifiedDate":"2017-07-05"},{"lineNumber":64,"author":{"gitId":"-"},"content":" DESC_AMY \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-07-05"},{"lineNumber":66,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":67,"author":{"gitId":"-"},"content":" DESC_BOB \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)","lastModifiedDate":"2017-07-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-07-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-05"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-05"},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * - the returned {@link CommandResult} matches {@code expectedCommandResult} \u003cbr\u003e","lastModifiedDate":"2018-12-09"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * - the {@code actualModel} matches {@code expectedModel}","lastModifiedDate":"2019-01-25"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, CommandResult expectedCommandResult,","lastModifiedDate":"2019-01-25"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":79,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":80,"author":{"gitId":"-"},"content":" CommandResult result \u003d command.execute(actualModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertEquals(expectedCommandResult, result);","lastModifiedDate":"2018-12-09"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertEquals(expectedModel, actualModel);","lastModifiedDate":"2017-06-05"},{"lineNumber":83,"author":{"gitId":"-"},"content":" } catch (CommandException ce) {","lastModifiedDate":"2017-08-15"},{"lineNumber":84,"author":{"gitId":"-"},"content":" throw new AssertionError(\"Execution of command should not fail.\", ce);","lastModifiedDate":"2017-08-15"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":88,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-12-09"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * Convenience wrapper to {@link #assertCommandSuccess(Command, Model, CommandResult, Model)}","lastModifiedDate":"2019-01-25"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * that takes a string {@code expectedMessage}.","lastModifiedDate":"2018-12-09"},{"lineNumber":91,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-12-09"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public static void assertCommandSuccess(Command command, Model actualModel, String expectedMessage,","lastModifiedDate":"2019-01-25"},{"lineNumber":93,"author":{"gitId":"-"},"content":" Model expectedModel) {","lastModifiedDate":"2019-01-25"},{"lineNumber":94,"author":{"gitId":"-"},"content":" CommandResult expectedCommandResult \u003d new CommandResult(expectedMessage);","lastModifiedDate":"2018-12-09"},{"lineNumber":95,"author":{"gitId":"-"},"content":" assertCommandSuccess(command, actualModel, expectedCommandResult, expectedModel);","lastModifiedDate":"2019-01-25"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-12-09"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Executes the given {@code command}, confirms that \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * - a {@code CommandException} is thrown \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * - the CommandException message matches {@code expectedMessage} \u003cbr\u003e","lastModifiedDate":"2017-06-05"},{"lineNumber":102,"author":{"gitId":"-"},"content":" * - the address book, filtered person list and selected person in {@code actualModel} remain unchanged","lastModifiedDate":"2019-01-25"},{"lineNumber":103,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static void assertCommandFailure(Command command, Model actualModel, String expectedMessage) {","lastModifiedDate":"2019-01-25"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // we are unable to defensively copy the model for comparison later, so we can","lastModifiedDate":"2017-06-05"},{"lineNumber":106,"author":{"gitId":"-"},"content":" // only do so by copying its components.","lastModifiedDate":"2017-06-05"},{"lineNumber":107,"author":{"gitId":"-"},"content":" AddressBook expectedAddressBook \u003d new AddressBook(actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":108,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e expectedFilteredList \u003d new ArrayList\u003c\u003e(actualModel.getFilteredPersonList());","lastModifiedDate":"2018-01-10"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertThrows(CommandException.class, expectedMessage, () -\u003e command.execute(actualModel));","lastModifiedDate":"2019-05-03"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertEquals(expectedAddressBook, actualModel.getAddressBook());","lastModifiedDate":"2017-06-05"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertEquals(expectedFilteredList, actualModel.getFilteredPersonList());","lastModifiedDate":"2017-06-05"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-20"},{"lineNumber":115,"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":116,"author":{"gitId":"-"},"content":" * {@code model}\u0027s address book.","lastModifiedDate":"2018-01-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-20"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public static void showPersonAtIndex(Model model, Index targetIndex) {","lastModifiedDate":"2018-01-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertTrue(targetIndex.getZeroBased() \u003c model.getFilteredPersonList().size());","lastModifiedDate":"2018-01-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-01-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":" Person person \u003d model.getFilteredPersonList().get(targetIndex.getZeroBased());","lastModifiedDate":"2018-01-31"},{"lineNumber":122,"author":{"gitId":"aureliony"},"content":" final String[] splitName \u003d person.getName().toString().split(\"\\\\s+\");","lastModifiedDate":"2024-03-02"},{"lineNumber":123,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(splitName[0])));","lastModifiedDate":"2017-07-20"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-20"},{"lineNumber":125,"author":{"gitId":"-"},"content":" assertEquals(1, model.getFilteredPersonList().size());","lastModifiedDate":"2018-02-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-20"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":128,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-05"}],"authorContributionMap":{"aureliony":1,"-":127}},{"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":"-"},"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.NAME_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;","lastModifiedDate":"2017-07-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;","lastModifiedDate":"2017-12-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;","lastModifiedDate":"2017-12-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;","lastModifiedDate":"2017-07-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;","lastModifiedDate":"2017-07-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;","lastModifiedDate":"2017-07-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;","lastModifiedDate":"2023-07-14"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;","lastModifiedDate":"2023-07-14"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;","lastModifiedDate":"2023-07-14"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2023-07-14"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;","lastModifiedDate":"2017-07-06"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.AMY;","lastModifiedDate":"2018-07-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BOB;","lastModifiedDate":"2018-07-25"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import seedu.address.logic.Messages;","lastModifiedDate":"2023-07-14"},{"lineNumber":39,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-06-15"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-28"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.testutil.PersonBuilder;","lastModifiedDate":"2017-06-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":43,"author":{"gitId":"-"},"content":"public class AddCommandParserTest {","lastModifiedDate":"2017-06-15"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" private final AddCommandParser parser \u003d new AddCommandParser();","lastModifiedDate":"2024-02-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public void parse_allFieldsPresent_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2018-07-25"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // whitespace only preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":55,"author":{"gitId":"-"},"content":" // multiple tags - all accepted","lastModifiedDate":"2017-06-15"},{"lineNumber":56,"author":{"gitId":"-"},"content":" Person expectedPersonMultipleTags \u003d new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)","lastModifiedDate":"2018-07-25"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .build();","lastModifiedDate":"2018-07-25"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseSuccess(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":59,"author":{"gitId":"-"},"content":" NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2023-07-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" new AddCommand(expectedPersonMultipleTags));","lastModifiedDate":"2023-07-14"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-14"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2023-07-14"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void parse_repeatedNonTagValue_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" String validExpectedPersonString \u003d NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2023-07-14"},{"lineNumber":66,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_FRIEND;","lastModifiedDate":"2023-07-14"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":68,"author":{"gitId":"-"},"content":" // multiple names","lastModifiedDate":"2023-07-14"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // multiple phones","lastModifiedDate":"2023-07-14"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PHONE_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":74,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":76,"author":{"gitId":"-"},"content":" // multiple emails","lastModifiedDate":"2023-07-14"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertParseFailure(parser, EMAIL_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":78,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // multiple addresses","lastModifiedDate":"2023-07-14"},{"lineNumber":81,"author":{"gitId":"-"},"content":" assertParseFailure(parser, ADDRESS_DESC_AMY + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // multiple fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertParseFailure(parser,","lastModifiedDate":"2023-07-14"},{"lineNumber":86,"author":{"gitId":"-"},"content":" validExpectedPersonString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":87,"author":{"gitId":"-"},"content":" + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME, PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // invalid value followed by valid value","lastModifiedDate":"2023-07-14"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":92,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2023-07-14"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":94,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME));","lastModifiedDate":"2023-07-14"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2023-07-14"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_EMAIL_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":98,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_EMAIL));","lastModifiedDate":"2023-07-14"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":100,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2023-07-14"},{"lineNumber":101,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_PHONE_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":104,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2023-07-14"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,","lastModifiedDate":"2023-07-14"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":108,"author":{"gitId":"-"},"content":" // valid value followed by invalid 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, validExpectedPersonString + INVALID_NAME_DESC,","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, validExpectedPersonString + INVALID_EMAIL_DESC,","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, validExpectedPersonString + INVALID_PHONE_DESC,","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, validExpectedPersonString + INVALID_ADDRESS_DESC,","lastModifiedDate":"2023-07-14"},{"lineNumber":124,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":127,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void parse_optionalFieldsMissing_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":129,"author":{"gitId":"-"},"content":" // zero tags","lastModifiedDate":"2017-06-15"},{"lineNumber":130,"author":{"gitId":"-"},"content":" Person expectedPerson \u003d new PersonBuilder(AMY).withTags().build();","lastModifiedDate":"2018-07-25"},{"lineNumber":131,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,","lastModifiedDate":"2017-12-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" new AddCommand(expectedPerson));","lastModifiedDate":"2017-12-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":135,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void parse_compulsoryFieldMissing_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":137,"author":{"gitId":"-"},"content":" String expectedMessage \u003d String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-06-15"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":139,"author":{"gitId":"-"},"content":" // missing name prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":143,"author":{"gitId":"-"},"content":" // missing phone prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":144,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":147,"author":{"gitId":"-"},"content":" // missing email prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":151,"author":{"gitId":"-"},"content":" // missing address prefix","lastModifiedDate":"2017-06-15"},{"lineNumber":152,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":155,"author":{"gitId":"-"},"content":" // all prefixes missing","lastModifiedDate":"2017-06-15"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,","lastModifiedDate":"2017-12-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":" expectedMessage);","lastModifiedDate":"2017-12-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":160,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-15"},{"lineNumber":161,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-06-15"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // invalid name","lastModifiedDate":"2017-06-15"},{"lineNumber":163,"author":{"gitId":"-"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":164,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // invalid phone","lastModifiedDate":"2017-06-15"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":168,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":170,"author":{"gitId":"-"},"content":" // invalid email","lastModifiedDate":"2017-06-15"},{"lineNumber":171,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":172,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":174,"author":{"gitId":"-"},"content":" // invalid address","lastModifiedDate":"2017-06-15"},{"lineNumber":175,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC","lastModifiedDate":"2017-12-23"},{"lineNumber":176,"author":{"gitId":"aureliony"},"content":" + TAG_DESC_HUSBAND + TAG_DESC_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":178,"author":{"gitId":"-"},"content":" // invalid tag","lastModifiedDate":"2017-06-15"},{"lineNumber":179,"author":{"gitId":"-"},"content":" assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":180,"author":{"gitId":"aureliony"},"content":" + INVALID_TAG_DESC + VALID_TAG_FRIEND);","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-15"},{"lineNumber":182,"author":{"gitId":"-"},"content":" // two invalid values, only first invalid value reported","lastModifiedDate":"2017-06-15"},{"lineNumber":183,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC);","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":" // non-empty preamble","lastModifiedDate":"2017-12-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB","lastModifiedDate":"2017-12-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,","lastModifiedDate":"2017-12-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-12-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-15"},{"lineNumber":190,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-15"}],"authorContributionMap":{"aureliony":7,"-":183}},{"path":"src/test/java/seedu/address/logic/parser/CommandParserTestUtil.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-07-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2019-03-15"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertThrows;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.Command;","lastModifiedDate":"2017-07-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2017-07-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-07-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * Contains helper methods for testing command parsers.","lastModifiedDate":"2017-07-06"},{"lineNumber":11,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":12,"author":{"gitId":"-"},"content":"public class CommandParserTestUtil {","lastModifiedDate":"2017-07-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is successful and the command created","lastModifiedDate":"2017-07-06"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * equals to {@code expectedCommand}.","lastModifiedDate":"2017-07-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static void assertParseSuccess(Parser\u003c? extends Command\u003e parser, String userInput,","lastModifiedDate":"2022-02-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Command expectedCommand) {","lastModifiedDate":"2022-02-20"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-08-15"},{"lineNumber":21,"author":{"gitId":"-"},"content":" Command command \u003d parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":22,"author":{"gitId":"-"},"content":" assertEquals(expectedCommand, command);","lastModifiedDate":"2017-07-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-08-15"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(\"Invalid userInput.\", pe);","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-08-15"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-07-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is unsuccessful and the error message","lastModifiedDate":"2017-07-06"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * equals to {@code expectedMessage}.","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static void assertParseFailure(Parser\u003c? extends Command\u003e parser, String userInput, String expectedMessage) {","lastModifiedDate":"2022-02-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2017-07-06"},{"lineNumber":34,"author":{"gitId":"-"},"content":" parser.parse(userInput);","lastModifiedDate":"2017-07-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":" throw new AssertionError(\"The expected ParseException was not thrown.\");","lastModifiedDate":"2018-08-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {","lastModifiedDate":"2017-07-06"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertEquals(expectedMessage, pe.getMessage());","lastModifiedDate":"2017-07-06"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-07-06"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":" /**","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"aureliony"},"content":" * Asserts that the parsing of {@code userInput} by {@code parser} is unsuccessful.","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" public static void assertParseFailure(Parser\u003c? extends Command\u003e parser, String userInput) {","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" assertThrows(ParseException.class, () -\u003e parser.parse(userInput));","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-07-06"}],"authorContributionMap":{"aureliony":9,"-":39}},{"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":"-"},"content":"import seedu.address.logic.commands.DeleteCommand;","lastModifiedDate":"2017-06-09"},{"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":"aureliony"},"content":" private final DeleteCommandParser parser \u003d new DeleteCommandParser();","lastModifiedDate":"2024-02-29"},{"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":"-"},"content":" assertParseSuccess(parser, \"1\", new DeleteCommand(INDEX_FIRST_PERSON));","lastModifiedDate":"2017-07-06"},{"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":"-"},"content":" assertParseFailure(parser, \"a\", String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-07-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-09"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-09"}],"authorContributionMap":{"aureliony":1,"-":31}},{"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":"-"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2017-05-04"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import seedu.address.testutil.EditPersonDescriptorBuilder;","lastModifiedDate":"2017-05-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"public class EditCommandParserTest {","lastModifiedDate":"2017-05-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private static final String TAG_EMPTY \u003d \" \" + PREFIX_TAG;","lastModifiedDate":"2017-05-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_FORMAT \u003d","lastModifiedDate":"2017-05-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE);","lastModifiedDate":"2017-05-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private EditCommandParser parser \u003d new EditCommandParser();","lastModifiedDate":"2017-05-04"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public void parse_missingParts_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // no index specified","lastModifiedDate":"2017-05-04"},{"lineNumber":55,"author":{"gitId":"-"},"content":" assertParseFailure(parser, VALID_NAME_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":57,"author":{"gitId":"-"},"content":" // no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1\", EditCommand.MESSAGE_NOT_EDITED);","lastModifiedDate":"2017-07-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":" // no index and no field specified","lastModifiedDate":"2017-05-04"},{"lineNumber":61,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"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_invalidPreamble_failure() {","lastModifiedDate":"2017-06-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":" // negative index","lastModifiedDate":"2017-05-04"},{"lineNumber":67,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"-5\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":69,"author":{"gitId":"-"},"content":" // zero index","lastModifiedDate":"2017-06-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"0\" + NAME_DESC_AMY, MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":" // invalid arguments being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":73,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 some random string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-06"},{"lineNumber":75,"author":{"gitId":"-"},"content":" // invalid prefix being parsed as preamble","lastModifiedDate":"2017-06-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" assertParseFailure(parser, \"1 i/ string\", MESSAGE_INVALID_FORMAT);","lastModifiedDate":"2017-07-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public void parse_invalidValue_failure() {","lastModifiedDate":"2017-05-04"},{"lineNumber":81,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC); // invalid name","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC); // invalid phone","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_EMAIL_DESC); // invalid email","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_ADDRESS_DESC); // invalid address","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_TAG_DESC); // invalid tag","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // invalid phone followed by valid email","lastModifiedDate":"2017-05-04"},{"lineNumber":88,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_PHONE_DESC + EMAIL_DESC_AMY);","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited,","lastModifiedDate":"2017-05-04"},{"lineNumber":91,"author":{"gitId":"-"},"content":" // parsing it together with a valid tag results in error","lastModifiedDate":"2017-05-04"},{"lineNumber":92,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_DESC_HUSBAND + TAG_EMPTY);","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + TAG_DESC_FRIEND + TAG_EMPTY + TAG_DESC_HUSBAND);","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + TAG_EMPTY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND);","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // multiple invalid values, but only the first invalid value is captured","lastModifiedDate":"2017-05-04"},{"lineNumber":97,"author":{"gitId":"aureliony"},"content":" assertParseFailure(parser, \"1\" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_AMY + VALID_PHONE_AMY);","lastModifiedDate":"2024-03-02"},{"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":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND","lastModifiedDate":"2017-06-06"},{"lineNumber":104,"author":{"gitId":"-"},"content":" + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND;","lastModifiedDate":"2017-06-06"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":106,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)","lastModifiedDate":"2017-05-04"},{"lineNumber":108,"author":{"gitId":"-"},"content":" .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":109,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":114,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public void parse_someFieldsSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":117,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":119,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)","lastModifiedDate":"2017-05-04"},{"lineNumber":120,"author":{"gitId":"-"},"content":" .withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":121,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void parse_oneFieldSpecified_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":128,"author":{"gitId":"-"},"content":" // name","lastModifiedDate":"2017-05-04"},{"lineNumber":129,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":130,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + NAME_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":131,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":132,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":135,"author":{"gitId":"-"},"content":" // phone","lastModifiedDate":"2017-05-04"},{"lineNumber":136,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":137,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":138,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"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":" // email","lastModifiedDate":"2017-05-04"},{"lineNumber":142,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + EMAIL_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":143,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":144,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"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":" // address","lastModifiedDate":"2017-05-04"},{"lineNumber":148,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + ADDRESS_DESC_AMY;","lastModifiedDate":"2017-05-25"},{"lineNumber":149,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();","lastModifiedDate":"2017-05-04"},{"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":" // tags","lastModifiedDate":"2017-05-04"},{"lineNumber":154,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + TAG_DESC_FRIEND;","lastModifiedDate":"2017-05-25"},{"lineNumber":155,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build();","lastModifiedDate":"2017-05-04"},{"lineNumber":156,"author":{"gitId":"-"},"content":" expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"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":"","lastModifiedDate":"2017-05-04"},{"lineNumber":160,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":" public void parse_multipleRepeatedFields_failure() {","lastModifiedDate":"2023-07-14"},{"lineNumber":162,"author":{"gitId":"-"},"content":" // More extensive testing of duplicate parameter detections is done in","lastModifiedDate":"2023-07-14"},{"lineNumber":163,"author":{"gitId":"-"},"content":" // AddCommandParserTest#parse_repeatedNonTagValue_failure()","lastModifiedDate":"2023-07-14"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // valid followed by invalid","lastModifiedDate":"2023-07-14"},{"lineNumber":166,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_FIRST_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":167,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + PHONE_DESC_BOB;","lastModifiedDate":"2023-07-14"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":169,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":171,"author":{"gitId":"-"},"content":" // invalid followed by valid","lastModifiedDate":"2023-07-14"},{"lineNumber":172,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_BOB + INVALID_PHONE_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":174,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));","lastModifiedDate":"2023-07-14"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-14"},{"lineNumber":176,"author":{"gitId":"-"},"content":" // mulltiple valid fields repeated","lastModifiedDate":"2023-07-14"},{"lineNumber":177,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY","lastModifiedDate":"2023-07-14"},{"lineNumber":178,"author":{"gitId":"-"},"content":" + TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND","lastModifiedDate":"2017-05-25"},{"lineNumber":179,"author":{"gitId":"-"},"content":" + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;","lastModifiedDate":"2017-05-25"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":182,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":184,"author":{"gitId":"-"},"content":" // multiple invalid values","lastModifiedDate":"2023-07-14"},{"lineNumber":185,"author":{"gitId":"-"},"content":" userInput \u003d targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC","lastModifiedDate":"2023-07-14"},{"lineNumber":186,"author":{"gitId":"-"},"content":" + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC;","lastModifiedDate":"2023-07-14"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":188,"author":{"gitId":"-"},"content":" assertParseFailure(parser, userInput,","lastModifiedDate":"2023-07-14"},{"lineNumber":189,"author":{"gitId":"-"},"content":" Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));","lastModifiedDate":"2023-07-14"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":192,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-04"},{"lineNumber":193,"author":{"gitId":"-"},"content":" public void parse_resetTags_success() {","lastModifiedDate":"2017-08-15"},{"lineNumber":194,"author":{"gitId":"-"},"content":" Index targetIndex \u003d INDEX_THIRD_PERSON;","lastModifiedDate":"2017-05-25"},{"lineNumber":195,"author":{"gitId":"-"},"content":" String userInput \u003d targetIndex.getOneBased() + TAG_EMPTY;","lastModifiedDate":"2017-05-25"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":197,"author":{"gitId":"-"},"content":" EditPersonDescriptor descriptor \u003d new EditPersonDescriptorBuilder().withTags().build();","lastModifiedDate":"2017-05-04"},{"lineNumber":198,"author":{"gitId":"-"},"content":" EditCommand expectedCommand \u003d new EditCommand(targetIndex, descriptor);","lastModifiedDate":"2017-05-04"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-04"},{"lineNumber":200,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, userInput, expectedCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-04"},{"lineNumber":202,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-04"}],"authorContributionMap":{"aureliony":10,"-":192}},{"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":"-"},"content":"import seedu.address.logic.commands.FindCommand;","lastModifiedDate":"2017-06-27"},{"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":"aureliony"},"content":" private final FindCommandParser parser \u003d new FindCommandParser();","lastModifiedDate":"2024-02-29"},{"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":"-"},"content":" assertParseFailure(parser, \" \", String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));","lastModifiedDate":"2017-07-06"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-06-27"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void parse_validArgs_returnsFindCommand() {","lastModifiedDate":"2017-08-15"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // no leading and trailing whitespaces","lastModifiedDate":"2017-06-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" FindCommand expectedFindCommand \u003d","lastModifiedDate":"2017-06-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new FindCommand(new NameContainsKeywordsPredicate(Arrays.asList(\"Alice\", \"Bob\")));","lastModifiedDate":"2017-06-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \"Alice Bob\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" // multiple whitespaces between keywords","lastModifiedDate":"2017-06-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" assertParseSuccess(parser, \" \\n Alice \\n \\t Bob \\t\", expectedFindCommand);","lastModifiedDate":"2017-07-06"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-06-27"}],"authorContributionMap":{"aureliony":1,"-":33}},{"path":"src/test/java/seedu/address/logic/parser/ParserUtilTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.logic.parser;","lastModifiedDate":"2017-05-22"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"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.parser.ParserUtil.MESSAGE_INVALID_INDEX;","lastModifiedDate":"2017-06-02"},{"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.TypicalIndexes.INDEX_FIRST_PERSON;","lastModifiedDate":"2017-08-05"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-22"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collections;","lastModifiedDate":"2017-05-22"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import seedu.address.logic.parser.exceptions.ParseException;","lastModifiedDate":"2018-07-10"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2017-05-22"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ParserUtilTest {","lastModifiedDate":"2017-05-22"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String INVALID_NAME \u003d \"R@chel\";","lastModifiedDate":"2017-05-22"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String INVALID_PHONE \u003d \"+651234\";","lastModifiedDate":"2017-05-22"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String INVALID_ADDRESS \u003d \" \";","lastModifiedDate":"2017-05-22"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String INVALID_EMAIL \u003d \"example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String INVALID_TAG \u003d \"#friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String VALID_NAME \u003d \"Rachel Walker\";","lastModifiedDate":"2017-05-22"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String VALID_PHONE \u003d \"123456\";","lastModifiedDate":"2017-05-22"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String VALID_ADDRESS \u003d \"123 Main Street #0505\";","lastModifiedDate":"2017-05-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String VALID_EMAIL \u003d \"rachel@example.com\";","lastModifiedDate":"2017-05-22"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_1 \u003d \"friend\";","lastModifiedDate":"2017-05-22"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String VALID_TAG_2 \u003d \"neighbour\";","lastModifiedDate":"2017-05-22"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String WHITESPACE \u003d \" \\t\\r\\n\";","lastModifiedDate":"2017-05-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void parseIndex_invalidInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseIndex(\"10 a\"));","lastModifiedDate":"2019-03-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void parseIndex_outOfRangeInput_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, MESSAGE_INVALID_INDEX, ()","lastModifiedDate":"2019-03-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" -\u003e ParserUtil.parseIndex(Long.toString(Integer.MAX_VALUE + 1)));","lastModifiedDate":"2019-03-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public void parseIndex_validInput_success() throws Exception {","lastModifiedDate":"2017-05-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // No whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\"1\"));","lastModifiedDate":"2017-05-25"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" // Leading and trailing whitespaces","lastModifiedDate":"2017-05-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertEquals(INDEX_FIRST_PERSON, ParserUtil.parseIndex(\" 1 \"));","lastModifiedDate":"2017-05-25"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void parseName_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseName((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":62,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public void parseName_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":64,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseName(INVALID_NAME));","lastModifiedDate":"2019-03-14"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":67,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public void parseName_validValueWithoutWhitespace_returnsName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-22"},{"lineNumber":70,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(VALID_NAME));","lastModifiedDate":"2017-05-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception {","lastModifiedDate":"2017-05-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":" String nameWithWhitespace \u003d WHITESPACE + VALID_NAME + WHITESPACE;","lastModifiedDate":"2017-05-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" Name expectedName \u003d new Name(VALID_NAME);","lastModifiedDate":"2017-05-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace));","lastModifiedDate":"2017-05-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void parsePhone_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parsePhone((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void parsePhone_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parsePhone(INVALID_PHONE));","lastModifiedDate":"2019-03-14"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":92,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-22"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE));","lastModifiedDate":"2017-05-30"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":98,"author":{"gitId":"-"},"content":" String phoneWithWhitespace \u003d WHITESPACE + VALID_PHONE + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":" Phone expectedPhone \u003d new Phone(VALID_PHONE);","lastModifiedDate":"2017-05-30"},{"lineNumber":100,"author":{"gitId":"-"},"content":" assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public void parseAddress_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseAddress((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":108,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":109,"author":{"gitId":"-"},"content":" public void parseAddress_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseAddress(INVALID_ADDRESS));","lastModifiedDate":"2019-03-14"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":115,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-22"},{"lineNumber":116,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));","lastModifiedDate":"2017-05-30"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":119,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":121,"author":{"gitId":"-"},"content":" String addressWithWhitespace \u003d WHITESPACE + VALID_ADDRESS + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":122,"author":{"gitId":"-"},"content":" Address expectedAddress \u003d new Address(VALID_ADDRESS);","lastModifiedDate":"2017-05-30"},{"lineNumber":123,"author":{"gitId":"-"},"content":" assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":126,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public void parseEmail_null_throwsNullPointerException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseEmail((String) null));","lastModifiedDate":"2019-03-14"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public void parseEmail_invalidValue_throwsParseException() {","lastModifiedDate":"2018-07-10"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseEmail(INVALID_EMAIL));","lastModifiedDate":"2019-03-14"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":138,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-22"},{"lineNumber":139,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL));","lastModifiedDate":"2017-05-30"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":142,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":143,"author":{"gitId":"-"},"content":" public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception {","lastModifiedDate":"2017-05-30"},{"lineNumber":144,"author":{"gitId":"-"},"content":" String emailWithWhitespace \u003d WHITESPACE + VALID_EMAIL + WHITESPACE;","lastModifiedDate":"2017-05-30"},{"lineNumber":145,"author":{"gitId":"-"},"content":" Email expectedEmail \u003d new Email(VALID_EMAIL);","lastModifiedDate":"2017-05-30"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace));","lastModifiedDate":"2017-05-30"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void parseTags_null_throwsNullPointerException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e ParserUtil.parseTags(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":154,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":155,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithInvalidTags_throwsParseException() {","lastModifiedDate":"2019-03-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertThrows(ParseException.class, () -\u003e ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, INVALID_TAG)));","lastModifiedDate":"2019-03-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":159,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":160,"author":{"gitId":"aureliony"},"content":" public void parseTags_emptyCollection_returnsEmptyTags() throws Exception {","lastModifiedDate":"2024-02-28"},{"lineNumber":161,"author":{"gitId":"aureliony"},"content":" assertEquals(new Tags(new Tag[0]), ParserUtil.parseTags(Collections.emptyList()));","lastModifiedDate":"2024-02-28"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":164,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-22"},{"lineNumber":165,"author":{"gitId":"-"},"content":" public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception {","lastModifiedDate":"2017-05-22"},{"lineNumber":166,"author":{"gitId":"aureliony"},"content":" Tags actualTags \u003d ParserUtil.parseTags(Arrays.asList(VALID_TAG_1, VALID_TAG_2));","lastModifiedDate":"2024-02-28"},{"lineNumber":167,"author":{"gitId":"aureliony"},"content":" Tags expectedTags \u003d new Tags(new Tag(VALID_TAG_1), new Tag(VALID_TAG_2));","lastModifiedDate":"2024-02-28"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-22"},{"lineNumber":169,"author":{"gitId":"aureliony"},"content":" assertEquals(expectedTags, actualTags);","lastModifiedDate":"2024-02-28"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-22"},{"lineNumber":171,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-22"}],"authorContributionMap":{"aureliony":10,"-":161}},{"path":"src/test/java/seedu/address/model/ModelManagerTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model;","lastModifiedDate":"2017-05-31"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"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.model.Model.PREDICATE_SHOW_ALL_PERSONS;","lastModifiedDate":"2017-08-05"},{"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":"2017-07-19"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.TypicalPersons.BENSON;","lastModifiedDate":"2017-07-19"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.nio.file.Path;","lastModifiedDate":"2018-11-27"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;","lastModifiedDate":"2018-08-09"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;","lastModifiedDate":"2017-05-31"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import seedu.address.commons.core.GuiSettings;","lastModifiedDate":"2018-11-27"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import seedu.address.model.person.NameContainsKeywordsPredicate;","lastModifiedDate":"2017-06-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import seedu.address.testutil.AddressBookBuilder;","lastModifiedDate":"2017-05-31"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":21,"author":{"gitId":"-"},"content":"public class ModelManagerTest {","lastModifiedDate":"2017-05-31"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-09-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private ModelManager modelManager \u003d new ModelManager();","lastModifiedDate":"2018-08-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public void constructor() {","lastModifiedDate":"2018-11-27"},{"lineNumber":27,"author":{"gitId":"-"},"content":" assertEquals(new UserPrefs(), modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":28,"author":{"gitId":"-"},"content":" assertEquals(new GuiSettings(), modelManager.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assertEquals(new AddressBook(), new AddressBook(modelManager.getAddressBook()));","lastModifiedDate":"2018-11-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void setUserPrefs_nullUserPrefs_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":34,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setUserPrefs(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public void setUserPrefs_validUserPrefs_copiesUserPrefs() {","lastModifiedDate":"2018-12-06"},{"lineNumber":39,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2018-11-27"},{"lineNumber":40,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"address/book/file/path\"));","lastModifiedDate":"2018-11-27"},{"lineNumber":41,"author":{"gitId":"-"},"content":" userPrefs.setGuiSettings(new GuiSettings(1, 2, 3, 4));","lastModifiedDate":"2018-11-27"},{"lineNumber":42,"author":{"gitId":"-"},"content":" modelManager.setUserPrefs(userPrefs);","lastModifiedDate":"2018-11-27"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertEquals(userPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-11-27"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-12-06"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // Modifying userPrefs should not modify modelManager\u0027s userPrefs","lastModifiedDate":"2018-12-06"},{"lineNumber":46,"author":{"gitId":"-"},"content":" UserPrefs oldUserPrefs \u003d new UserPrefs(userPrefs);","lastModifiedDate":"2018-12-06"},{"lineNumber":47,"author":{"gitId":"-"},"content":" userPrefs.setAddressBookFilePath(Paths.get(\"new/address/book/file/path\"));","lastModifiedDate":"2018-12-06"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertEquals(oldUserPrefs, modelManager.getUserPrefs());","lastModifiedDate":"2018-12-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void setGuiSettings_nullGuiSettings_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":53,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setGuiSettings(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setGuiSettings_validGuiSettings_setsGuiSettings() {","lastModifiedDate":"2018-11-27"},{"lineNumber":58,"author":{"gitId":"-"},"content":" GuiSettings guiSettings \u003d new GuiSettings(1, 2, 3, 4);","lastModifiedDate":"2018-11-27"},{"lineNumber":59,"author":{"gitId":"-"},"content":" modelManager.setGuiSettings(guiSettings);","lastModifiedDate":"2018-11-27"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertEquals(guiSettings, modelManager.getGuiSettings());","lastModifiedDate":"2018-11-27"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_nullPath_throwsNullPointerException() {","lastModifiedDate":"2018-11-27"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.setAddressBookFilePath(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":68,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-11-27"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public void setAddressBookFilePath_validPath_setsAddressBookFilePath() {","lastModifiedDate":"2018-11-27"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Path path \u003d Paths.get(\"address/book/file/path\");","lastModifiedDate":"2018-11-27"},{"lineNumber":71,"author":{"gitId":"-"},"content":" modelManager.setAddressBookFilePath(path);","lastModifiedDate":"2018-11-27"},{"lineNumber":72,"author":{"gitId":"-"},"content":" assertEquals(path, modelManager.getAddressBookFilePath());","lastModifiedDate":"2018-11-27"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-11-27"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-11-27"},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void hasPerson_nullPerson_throwsNullPointerException() {","lastModifiedDate":"2018-08-06"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e modelManager.hasPerson(null));","lastModifiedDate":"2019-03-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void hasPerson_personNotInAddressBook_returnsFalse() {","lastModifiedDate":"2018-08-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":" assertFalse(modelManager.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2018-08-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void hasPerson_personInAddressBook_returnsTrue() {","lastModifiedDate":"2018-08-07"},{"lineNumber":87,"author":{"gitId":"-"},"content":" modelManager.addPerson(ALICE);","lastModifiedDate":"2018-08-06"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(modelManager.hasPerson(ALICE));","lastModifiedDate":"2018-08-06"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-08-06"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-08-06"},{"lineNumber":91,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-09-01"},{"lineNumber":92,"author":{"gitId":"-"},"content":" public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() {","lastModifiedDate":"2017-09-01"},{"lineNumber":93,"author":{"gitId":"-"},"content":" assertThrows(UnsupportedOperationException.class, () -\u003e modelManager.getFilteredPersonList().remove(0));","lastModifiedDate":"2019-03-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-09-01"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-31"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2017-08-15"},{"lineNumber":98,"author":{"gitId":"-"},"content":" AddressBook addressBook \u003d new AddressBookBuilder().withPerson(ALICE).withPerson(BENSON).build();","lastModifiedDate":"2017-07-19"},{"lineNumber":99,"author":{"gitId":"-"},"content":" AddressBook differentAddressBook \u003d new AddressBook();","lastModifiedDate":"2017-05-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":" UserPrefs userPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" modelManager \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2018-08-06"},{"lineNumber":104,"author":{"gitId":"-"},"content":" ModelManager modelManagerCopy \u003d new ModelManager(addressBook, userPrefs);","lastModifiedDate":"2017-05-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManagerCopy));","lastModifiedDate":"2017-05-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2017-05-31"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertTrue(modelManager.equals(modelManager));","lastModifiedDate":"2017-05-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(null));","lastModifiedDate":"2017-05-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(5));","lastModifiedDate":"2017-05-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":" // different addressBook -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(differentAddressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":" // different filteredList -\u003e returns false","lastModifiedDate":"2017-05-31"},{"lineNumber":120,"author":{"gitId":"aureliony"},"content":" String[] keywords \u003d ALICE.getName().toString().split(\"\\\\s+\");","lastModifiedDate":"2024-03-02"},{"lineNumber":121,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(new NameContainsKeywordsPredicate(Arrays.asList(keywords)));","lastModifiedDate":"2017-06-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, userPrefs)));","lastModifiedDate":"2017-05-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-08-05"},{"lineNumber":124,"author":{"gitId":"-"},"content":" // resets modelManager to initial state for upcoming tests","lastModifiedDate":"2017-08-05"},{"lineNumber":125,"author":{"gitId":"-"},"content":" modelManager.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2017-08-05"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":" // different userPrefs -\u003e returns false","lastModifiedDate":"2018-11-27"},{"lineNumber":128,"author":{"gitId":"-"},"content":" UserPrefs differentUserPrefs \u003d new UserPrefs();","lastModifiedDate":"2017-05-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":" differentUserPrefs.setAddressBookFilePath(Paths.get(\"differentFilePath\"));","lastModifiedDate":"2018-08-09"},{"lineNumber":130,"author":{"gitId":"-"},"content":" assertFalse(modelManager.equals(new ModelManager(addressBook, differentUserPrefs)));","lastModifiedDate":"2018-11-27"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-31"}],"authorContributionMap":{"aureliony":1,"-":131}},{"path":"src/test/java/seedu/address/model/person/fields/AddressTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class AddressTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Address(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidAddress_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Address(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Address(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" public void constructor_validAddress_success() {","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" // valid addresses","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Address(\"Blk 456, Den Road, #01-355\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Address(\"-\")); // one character","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" new Address(\"Leng Inc; 1234 Market St; San Francisco CA 2349879; USA\")); // long address","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Address address \u003d new Address(\"Valid Address\");","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" assertTrue(address.equals(new Address(\"Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" assertTrue(address.equals(address));","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertFalse(address.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" assertFalse(address.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" assertFalse(address.equals(new Address(\"Other Valid Address\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":10,"-":42}},{"path":"src/test/java/seedu/address/model/person/fields/EmailTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class EmailTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Email(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidEmail_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // blank email","lastModifiedDate":"2017-01-16"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // missing parts","lastModifiedDate":"2017-01-16"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"@example.com\")); // missing local part","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"peterjackexample.com\")); // missing \u0027@\u0027 symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Email(\"peterjack@\")); // missing domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"-"},"content":" // invalid parts","lastModifiedDate":"2017-01-16"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@-\")); // invalid domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@exam_ple.com\")); // underscore in domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"aureliony"},"content":" new Email(\"peter jack@example.com\")); // spaces in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@exam ple.com\")); // spaces in domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"aureliony"},"content":" new Email(\" peterjack@example.com\")); // leading space","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.com \")); // trailing space","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@@example.com\")); // double \u0027@\u0027 symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"aureliony"},"content":" new Email(\"peter@jack@example.com\")); // \u0027@\u0027 symbol in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" new Email(\"-peterjack@example.com\")); // local part starts with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack-@example.com\")); // local part ends with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" new Email(\"peter..jack@example.com\")); // local part has two consecutive periods","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example@com\")); // \u0027@\u0027 symbol in domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@.example.com\")); // domain name starts with a period","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.com.\")); // domain name ends with a period","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@-example.com\")); // domain name starts with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.com-\")); // domain name ends with a hyphen","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"aureliony"},"content":" new Email(\"peterjack@example.c\")); // top level domain has less than two chars","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":65,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"aureliony"},"content":" public void constructor_validEmail_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack_1190@example.com\")); // underscore in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack.1190@example.com\")); // period in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack+1190@example.com\")); // \u0027+\u0027 symbol in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"PeterJack-1190@example.com\")); // hyphen in local part","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"a@bc\")); // minimal","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"test@localhost\")); // alphabets only","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"123@145\")); // numeric local part and domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"a1+be.d@example1.com\")); // mixture of alphanumeric and special characters","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"peter_jack@very-very-very-long-example.com\")); // long domain name","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"if.you.dream.it_you.can.do.it@example.com\")); // long local part","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Email(\"e1234567@u.nus.edu\")); // more than one period in domain","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Email email \u003d new Email(\"valid@email\");","lastModifiedDate":"2019-02-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertTrue(email.equals(new Email(\"valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" assertTrue(email.equals(email));","lastModifiedDate":"2019-02-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertFalse(email.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" assertFalse(email.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" assertFalse(email.equals(new Email(\"other.valid@email\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":55,"-":44}},{"path":"src/test/java/seedu/address/model/person/fields/NameTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class NameTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Name(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\"^\")); // only non-alphanumeric characters","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Name(\"peter*\")); // contains non-alphanumeric characters","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" public void constructor_validName_success() {","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"peter jack\")); // alphabets only","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"12345\")); // numbers only","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"peter the 2nd\")); // alphanumeric characters","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"Capital Tan\")); // with capital letters","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Name(\"David Roger Jackson Ray Jr 2nd\")); // long names","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Name name \u003d new Name(\"Valid Name\");","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(name.equals(new Name(\"Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertTrue(name.equals(name));","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(name.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(name.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(name.equals(new Name(\"Other Valid Name\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":13,"-":41}},{"path":"src/test/java/seedu/address/model/person/fields/PhoneTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"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.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class PhoneTest {","lastModifiedDate":"2017-01-16"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":12,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":13,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Phone(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":15,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public void constructor_invalidPhone_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\" \")); // spaces only","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"91\")); // less than 3 numbers","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"phone\")); // non-numeric","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"9011p041\")); // alphabets within digits","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Phone(\"9312 1534\")); // spaces within digits","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-01-16"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" public void constructor_validPhone_throwsIllegalArgumentException() {","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Phone(\"911\")); // exactly 3 numbers","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Phone(\"93121534\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Phone(\"124293842033123\")); // long phone numbers","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-01-16"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2019-02-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void equals() {","lastModifiedDate":"2019-02-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Phone phone \u003d new Phone(\"999\");","lastModifiedDate":"2019-02-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" // same values -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(new Phone(\"999\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" // same object -\u003e returns true","lastModifiedDate":"2019-02-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":" assertTrue(phone.equals(phone));","lastModifiedDate":"2019-02-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" // null -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(null));","lastModifiedDate":"2019-02-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":" // different types -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(5.0f));","lastModifiedDate":"2019-02-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-02-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // different values -\u003e returns false","lastModifiedDate":"2019-02-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" assertFalse(phone.equals(new Phone(\"995\")));","lastModifiedDate":"2019-02-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2019-02-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-01-16"}],"authorContributionMap":{"aureliony":12,"-":41}},{"path":"src/test/java/seedu/address/model/person/fields/TagsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.model.person.fields;","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertNotEquals;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.tag.Tag;","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"class TagsTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":" private static final String[] emptyStringArray \u003d new String[0];","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" private static final Tag[] emptyTagArray \u003d new Tag[0];","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" public void constructor_emptyArray_success() {","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" assertEquals(new Tags(emptyTagArray), new Tags(emptyStringArray));","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" void equals_null_false() {","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":" assertNotEquals(null, new Tags(emptyTagArray));","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"aureliony":26}},{"path":"src/test/java/seedu/address/model/tag/TagTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.tag;","lastModifiedDate":"2017-12-04"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.testutil.Assert.assertThrows;","lastModifiedDate":"2019-03-14"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2019-03-14"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2019-04-27"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class TagTest {","lastModifiedDate":"2017-12-04"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":10,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public void constructor_null_throwsNullPointerException() {","lastModifiedDate":"2017-12-04"},{"lineNumber":12,"author":{"gitId":"-"},"content":" assertThrows(NullPointerException.class, () -\u003e new Tag(null));","lastModifiedDate":"2019-03-14"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-05-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public void constructor_invalidTagName_throwsIllegalArgumentException() {","lastModifiedDate":"2017-05-30"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"\")); // empty string","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"Hello@World\")); // not alphanumeric","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"Testing 123\")); // contains space","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" assertThrows(IllegalArgumentException.class, () -\u003e new Tag(\"Café123\")); // contains illegal unicode character","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-30"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-30"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Test","lastModifiedDate":"2017-12-04"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public void isValidTagName() {","lastModifiedDate":"2017-12-04"},{"lineNumber":25,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"a\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"abc\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"validTag\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"ValidTag\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"aureliony"},"content":" assertDoesNotThrow(() -\u003e new Tag(\"VALIDTAG\"));","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-12-04"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-12-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-12-04"}],"authorContributionMap":{"aureliony":10,"-":22}},{"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 seedu.address.logic.commands.EditCommand.EditPersonDescriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-05-05"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * A utility class to help with building EditPersonDescriptor objects.","lastModifiedDate":"2017-05-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-05-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class EditPersonDescriptorBuilder {","lastModifiedDate":"2017-05-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private EditPersonDescriptor descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder() {","lastModifiedDate":"2017-05-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-05-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) {","lastModifiedDate":"2017-05-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":" this.descriptor \u003d new EditPersonDescriptor(descriptor);","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":" /**","lastModifiedDate":"2017-06-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Returns an {@code EditPersonDescriptor} with fields containing {@code person}\u0027s details","lastModifiedDate":"2017-06-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-06-05"},{"lineNumber":29,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":30,"author":{"gitId":"-"},"content":" descriptor \u003d new EditPersonDescriptor();","lastModifiedDate":"2017-06-05"},{"lineNumber":31,"author":{"gitId":"-"},"content":" descriptor.setName(person.getName());","lastModifiedDate":"2017-06-21"},{"lineNumber":32,"author":{"gitId":"-"},"content":" descriptor.setPhone(person.getPhone());","lastModifiedDate":"2017-06-21"},{"lineNumber":33,"author":{"gitId":"-"},"content":" descriptor.setEmail(person.getEmail());","lastModifiedDate":"2017-06-21"},{"lineNumber":34,"author":{"gitId":"-"},"content":" descriptor.setAddress(person.getAddress());","lastModifiedDate":"2017-06-21"},{"lineNumber":35,"author":{"gitId":"-"},"content":" descriptor.setTags(person.getTags());","lastModifiedDate":"2017-06-21"},{"lineNumber":36,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-06-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-06-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" descriptor.setName(new Name(name));","lastModifiedDate":"2017-12-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} 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 withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":50,"author":{"gitId":"-"},"content":" descriptor.setPhone(new Phone(phone));","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":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":58,"author":{"gitId":"-"},"content":" descriptor.setEmail(new Email(email));","lastModifiedDate":"2017-12-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":62,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":66,"author":{"gitId":"-"},"content":" descriptor.setAddress(new Address(address));","lastModifiedDate":"2017-12-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":70,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":71,"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":72,"author":{"gitId":"-"},"content":" * that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":73,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public EditPersonDescriptorBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":75,"author":{"gitId":"aureliony"},"content":" descriptor.setTags(new Tags(tags));","lastModifiedDate":"2024-02-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2017-05-05"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-05"},{"lineNumber":79,"author":{"gitId":"-"},"content":" public EditPersonDescriptor build() {","lastModifiedDate":"2017-05-05"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return descriptor;","lastModifiedDate":"2017-05-05"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-05-05"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-05-05"}],"authorContributionMap":{"aureliony":6,"-":76}},{"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 seedu.address.model.person.Person;","lastModifiedDate":"2017-04-05"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Address;","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Email;","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Name;","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Phone;","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.fields.Tags;","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.model.util.SampleDataUtil;","lastModifiedDate":"2017-04-05"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-09-03"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * A utility class to help with building Person objects.","lastModifiedDate":"2017-04-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-09-03"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class PersonBuilder {","lastModifiedDate":"2016-09-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":16,"author":{"gitId":"-"},"content":" public static final String DEFAULT_NAME \u003d \"Amy Bee\";","lastModifiedDate":"2020-12-18"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public static final String DEFAULT_PHONE \u003d \"85355255\";","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EMAIL \u003d \"amy@gmail.com\";","lastModifiedDate":"2020-12-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public static final String DEFAULT_ADDRESS \u003d \"123, Jurong West Ave 6, #08-111\";","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" public static final String[] DEFAULT_TAGS \u003d { };","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private Name name;","lastModifiedDate":"2017-12-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private Phone phone;","lastModifiedDate":"2017-12-20"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private Email email;","lastModifiedDate":"2017-12-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private Address address;","lastModifiedDate":"2017-12-20"},{"lineNumber":26,"author":{"gitId":"aureliony"},"content":" private Tags tags;","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-27"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Creates a {@code PersonBuilder} with the default details.","lastModifiedDate":"2020-05-27"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-27"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public PersonBuilder() {","lastModifiedDate":"2017-08-15"},{"lineNumber":32,"author":{"gitId":"-"},"content":" name \u003d new Name(DEFAULT_NAME);","lastModifiedDate":"2017-12-20"},{"lineNumber":33,"author":{"gitId":"-"},"content":" phone \u003d new Phone(DEFAULT_PHONE);","lastModifiedDate":"2017-12-20"},{"lineNumber":34,"author":{"gitId":"-"},"content":" email \u003d new Email(DEFAULT_EMAIL);","lastModifiedDate":"2017-12-20"},{"lineNumber":35,"author":{"gitId":"-"},"content":" address \u003d new Address(DEFAULT_ADDRESS);","lastModifiedDate":"2017-12-20"},{"lineNumber":36,"author":{"gitId":"aureliony"},"content":" tags \u003d new Tags(DEFAULT_TAGS);","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-12-11"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Initializes the PersonBuilder with the data of {@code personToCopy}.","lastModifiedDate":"2016-12-11"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-12-11"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public PersonBuilder(Person personToCopy) {","lastModifiedDate":"2018-01-10"},{"lineNumber":43,"author":{"gitId":"-"},"content":" name \u003d personToCopy.getName();","lastModifiedDate":"2017-12-20"},{"lineNumber":44,"author":{"gitId":"-"},"content":" phone \u003d personToCopy.getPhone();","lastModifiedDate":"2017-12-20"},{"lineNumber":45,"author":{"gitId":"-"},"content":" email \u003d personToCopy.getEmail();","lastModifiedDate":"2017-12-20"},{"lineNumber":46,"author":{"gitId":"-"},"content":" address \u003d personToCopy.getAddress();","lastModifiedDate":"2017-12-20"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" tags \u003d personToCopy.getTags();","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-12-11"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-12-11"},{"lineNumber":50,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":" * Sets the {@code Name} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public PersonBuilder withName(String name) {","lastModifiedDate":"2017-08-15"},{"lineNumber":54,"author":{"gitId":"-"},"content":" this.name \u003d new Name(name);","lastModifiedDate":"2017-12-20"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":59,"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":60,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public PersonBuilder withTags(String... tags) {","lastModifiedDate":"2017-08-15"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.tags \u003d SampleDataUtil.getTagSet(tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":" * Sets the {@code Address} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public PersonBuilder withAddress(String address) {","lastModifiedDate":"2017-08-15"},{"lineNumber":70,"author":{"gitId":"-"},"content":" this.address \u003d new Address(address);","lastModifiedDate":"2017-12-20"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Sets the {@code Phone} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":76,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":77,"author":{"gitId":"-"},"content":" public PersonBuilder withPhone(String phone) {","lastModifiedDate":"2017-08-15"},{"lineNumber":78,"author":{"gitId":"-"},"content":" this.phone \u003d new Phone(phone);","lastModifiedDate":"2017-12-20"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-07-26"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Sets the {@code Email} of the {@code Person} that we are building.","lastModifiedDate":"2017-07-26"},{"lineNumber":84,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-07-26"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public PersonBuilder withEmail(String email) {","lastModifiedDate":"2017-08-15"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.email \u003d new Email(email);","lastModifiedDate":"2017-12-20"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return this;","lastModifiedDate":"2016-09-03"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":90,"author":{"gitId":"-"},"content":" public Person build() {","lastModifiedDate":"2017-04-05"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return new Person(name, phone, email, address, tags);","lastModifiedDate":"2017-12-20"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-09-03"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-09-03"}],"authorContributionMap":{"aureliony":9,"-":85}},{"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":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;","lastModifiedDate":"2017-05-09"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;","lastModifiedDate":"2017-05-09"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-05-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import seedu.address.logic.commands.AddCommand;","lastModifiedDate":"2017-03-29"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.logic.commands.EditCommand;","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2018-01-10"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2017-04-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * A utility class for Person.","lastModifiedDate":"2017-04-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class PersonUtil {","lastModifiedDate":"2017-04-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-05"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Returns an add command string for adding the {@code person}.","lastModifiedDate":"2017-04-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static String getAddCommand(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return AddCommand.COMMAND_WORD + \" \" + getPersonDetails(person);","lastModifiedDate":"2017-03-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-04-06"},{"lineNumber":25,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2017-04-06"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code person}\u0027s details.","lastModifiedDate":"2017-04-06"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-04-06"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public static String getPersonDetails(Person person) {","lastModifiedDate":"2018-01-10"},{"lineNumber":29,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2017-04-05"},{"lineNumber":30,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_NAME).append(person.getName()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":31,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_PHONE).append(person.getPhone()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_EMAIL).append(person.getEmail()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":33,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_ADDRESS).append(person.getAddress()).append(\" \");","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":" person.getTags().stream().forEach(","lastModifiedDate":"2017-05-09"},{"lineNumber":35,"author":{"gitId":"aureliony"},"content":" s -\u003e sb.append(PREFIX_TAG).append(s.get()).append(\" \")","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"-"},"content":" );","lastModifiedDate":"2017-05-09"},{"lineNumber":37,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2017-04-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2017-04-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2018-03-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2018-03-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * Returns the part of command string for the given {@code EditPersonDescriptor}\u0027s details.","lastModifiedDate":"2018-03-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2018-03-26"},{"lineNumber":43,"author":{"gitId":"aureliony"},"content":" public static String getEditPersonDescriptorDetails(EditCommand.EditPersonDescriptor descriptor) {","lastModifiedDate":"2024-02-28"},{"lineNumber":44,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();","lastModifiedDate":"2018-03-26"},{"lineNumber":45,"author":{"gitId":"aureliony"},"content":" descriptor.getName().ifPresent(name -\u003e sb.append(PREFIX_NAME).append(name).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"aureliony"},"content":" descriptor.getPhone().ifPresent(phone -\u003e sb.append(PREFIX_PHONE).append(phone).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"aureliony"},"content":" descriptor.getEmail().ifPresent(email -\u003e sb.append(PREFIX_EMAIL).append(email).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":48,"author":{"gitId":"aureliony"},"content":" descriptor.getAddress().ifPresent(address -\u003e sb.append(PREFIX_ADDRESS).append(address).append(\" \"));","lastModifiedDate":"2024-02-28"},{"lineNumber":49,"author":{"gitId":"-"},"content":" if (descriptor.getTags().isPresent()) {","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"aureliony"},"content":" sb.append(PREFIX_TAG);","lastModifiedDate":"2024-02-28"},{"lineNumber":51,"author":{"gitId":"aureliony"},"content":" descriptor.getTags().get().stream().forEach(s -\u003e sb.append(PREFIX_TAG).append(s.get()).append(\" \"));","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return sb.toString();","lastModifiedDate":"2018-03-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2018-03-26"},{"lineNumber":55,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2017-04-05"}],"authorContributionMap":{"aureliony":14,"-":42}},{"path":"src/test/java/seedu/address/testutil/TypicalPersonsTest.java","fileType":"test-code","lines":[{"lineNumber":1,"author":{"gitId":"aureliony"},"content":"package seedu.address.testutil;","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"aureliony"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"aureliony"},"content":"import static seedu.address.testutil.TypicalPersons.getTypicalPersons;","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"aureliony"},"content":"import java.util.List;","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"aureliony"},"content":"import org.junit.jupiter.api.Test;","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.AddressBook;","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"aureliony"},"content":"import seedu.address.model.person.Person;","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"aureliony"},"content":"class TypicalPersonsTest {","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"aureliony"},"content":" void execute_getTypicalAddressBook_success() {","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"aureliony"},"content":" AddressBook ab \u003d getTypicalAddressBook();","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"aureliony"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"aureliony"},"content":" @Test","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"aureliony"},"content":" void execute_getTypicalPersons_success() {","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"aureliony"},"content":" List\u003cPerson\u003e list \u003d getTypicalPersons();","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"aureliony"},"content":" }","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"aureliony"},"content":"}","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"aureliony":23}}] diff --git a/AY2324S2-CS2103T-W12-3_tp_master/commits.json b/AY2324S2-CS2103T-W12-3_tp_master/commits.json index 62863ab4..16093b5e 100644 --- a/AY2324S2-CS2103T-W12-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W12-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"darkvoid32":[{"date":"2024-02-27","commitResults":[{"hash":"dfb1e3d9d11c8ec57f1e75b774696544e9b2405e","isMergeCommit":true,"messageTitle":"Merge pull request #7 from aureliony/refactor","messageBody":"Refactor existing JSON serialization and deserialization code to our current uses.","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"67d9d583455f4ce2db3235341841ea1ec9abe957","isMergeCommit":false,"messageTitle":"Update AboutUs page for Yetong","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":6}}},{"hash":"bf7a5eefde3db6e23c9809a814cd95305b0ab69b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs-Yetong","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1d0a526712f87e29e4dd6028d6bccbb540515178","isMergeCommit":true,"messageTitle":"Merge pull request #9 from darkvoid32/branch-AboutUs-Yetong","messageBody":"Update AboutUs page for Yetong","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"374dacd516ecffee8ee77a039385493d75f281d6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Replaced Ui.png with our new Ui mockup.\nUpdated description to what our application does\n\nMore details can be added later when UG and / or DG is created\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":11}}},{"hash":"e4bb811ff5d15001c99c5d251642eeb7cb06b75a","isMergeCommit":false,"messageTitle":"Fixed Yetong\u0027s AboutUs page and added Rizki\u0027s","messageBody":"Changed jpg file to png to fix Yetong\u0027s AboutUs page.\nChanged Yetong\u0027s page to match other team members.\nAdded Rizki\u0027s page and AboutUs section.\n","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":44}}}]}],"yisiox":[{"date":"2024-03-04","commitResults":[{"hash":"ecb74c12be5dc1d8dde290c0bf5882de2d49e6c0","isMergeCommit":false,"messageTitle":"Update AboutUs for yisiox","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":18}}},{"hash":"a730973d1d28ec36f459da79b1fc12f6329f3038","isMergeCommit":false,"messageTitle":"Fix portfolio link and grammar","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}}]}],"rizkidelta":[{"date":"2024-03-04","commitResults":[{"hash":"1d4aeaba064ee4bc01ddcafb8959365f7354a6ff","isMergeCommit":true,"messageTitle":"Merge pull request #41 from darkvoid32/branch-Update-README","messageBody":"Updated README.md","fileTypesAndContributionMap":{}},{"hash":"a4a550ff291ae27ed793e405731c985f418491f9","isMergeCommit":true,"messageTitle":"Merge pull request #43 from darkvoid32/branch-Update-README-Rizki","messageBody":"Fixed Yetong\u0027s AboutUs page and added Rizki\u0027s","fileTypesAndContributionMap":{}}]}],"aureliony":[{"date":"2024-02-26","commitResults":[{"hash":"f50f8265764a4237a560cd39841cbc0d1a6a2ad2","isMergeCommit":false,"messageTitle":"Remove JsonAdaptedPerson and JsonAdaptedTag","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":169},"test-code":{"insertions":0,"deletions":110}}},{"hash":"5cf15e318fbc4f8362dfd4d0305070c082e59f9d","isMergeCommit":false,"messageTitle":"Move Json annotations into Person and Tag","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":27,"deletions":22}}},{"hash":"2eeeb964416924bf0f9a7df3216bc6140f2b9cf9","isMergeCommit":false,"messageTitle":"Revert ObjectMapper changes","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":24,"deletions":1}}},{"hash":"cd6d7fa261ad6227f6f67a612d77290f442ea665","isMergeCommit":false,"messageTitle":"Fix JsonSerializableAddressBookTest","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":4,"deletions":4}}},{"hash":"a6de5b5404adc81bb9300dd5bc483fce6b4b9774","isMergeCommit":false,"messageTitle":"Make AddressBook serializable","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":15,"deletions":12}}},{"hash":"a69b4621c80562939abf380a5b899d028a44668c","isMergeCommit":false,"messageTitle":"Add JsonValue notations","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":49,"deletions":20}}},{"hash":"3670249bee606c37c8a150ed8c5095a46300548d","isMergeCommit":false,"messageTitle":"Remove JsonSerializableAddressBook","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":58},"test-code":{"insertions":0,"deletions":47}}},{"hash":"1da3353380d9649b2d00f714e7482dffe45ed587","isMergeCommit":false,"messageTitle":"Remove unnecessary annotations","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":17}}}]},{"date":"2024-02-27","commitResults":[{"hash":"711f3460ddcf56d80ab5a29a49cc6be300d46c24","isMergeCommit":false,"messageTitle":"Add custom deserializer for UniquePersonList","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":58,"deletions":3}}},{"hash":"39665b57f1a551d894a56dcf246187d1785ba208","isMergeCommit":false,"messageTitle":"Cleanup and fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":5,"deletions":3}}},{"hash":"ffc7ed0bd22ec4499e48bfcb88e2a831aa50d412","isMergeCommit":false,"messageTitle":"Refactor variable names","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":35,"deletions":44},"test-code":{"insertions":10,"deletions":10}}},{"hash":"33f7ebb6299e173dadc059430fc68fd2ed24bcea","isMergeCommit":false,"messageTitle":"Cleanup Phone.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":5}}},{"hash":"583b7311eb215fd73f9c91f63f692748c2ba59f0","isMergeCommit":false,"messageTitle":"Remove unnecessary getters","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":21}}},{"hash":"7ba691f1ef9f60ea3175a0f8ada5da2195b2351e","isMergeCommit":false,"messageTitle":"Remove unnecessary annotation","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":2}}},{"hash":"e2e21bf40d7cc7b11a40c54edccc0d9bc93b5243","isMergeCommit":false,"messageTitle":"Add null check for tagNames","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":2}}},{"hash":"10d3015ffc6c5c59058652b212327aa5bda33807","isMergeCommit":false,"messageTitle":"Remove non-null requirement for tagNames","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":1}}},{"hash":"db5664d596daf515c62e23232a749d738619a7e6","isMergeCommit":false,"messageTitle":"Move Person fields into separate packages","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":0},"other":{"insertions":0,"deletions":0}}}]},{"date":"2024-02-28","commitResults":[{"hash":"94f582cc03a50ccca03e16f05648c833d47eb5b4","isMergeCommit":false,"messageTitle":"Abstract out Set\u003cTag\u003e into new Tags class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":155,"deletions":105},"test-code":{"insertions":52,"deletions":71}}},{"hash":"64030dda160eb7d9d8d25d23bc22589d492b7560","isMergeCommit":false,"messageTitle":"Fix passing null into Person.java constructor","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":18},"test-code":{"insertions":23,"deletions":23}}},{"hash":"977232187a797112e4c9e9b99222b5018265c917","isMergeCommit":false,"messageTitle":"Fix remaining testcases","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":27,"deletions":15},"test-code":{"insertions":11,"deletions":7}}},{"hash":"f0db2f933ede34567c506c7530b5d00b2334c380","isMergeCommit":false,"messageTitle":"Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":7},"test-code":{"insertions":1,"deletions":1}}},{"hash":"203ad1f68a26f417863ae4632e2a84ecbd92f76f","isMergeCommit":false,"messageTitle":"Add TagTest","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":4,"deletions":12},"test-code":{"insertions":26,"deletions":0}}}]},{"date":"2024-02-29","commitResults":[{"hash":"804bd736b2d34b9b13ac2b67ea821c1037afa2db","isMergeCommit":false,"messageTitle":"Remove Optional and Mandatory packages","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":26,"deletions":43},"other":{"insertions":15,"deletions":15},"test-code":{"insertions":30,"deletions":30}}}]},{"date":"2024-03-01","commitResults":[{"hash":"a7510bc445736eea88bfa52a26ac2729fb87c5c8","isMergeCommit":true,"messageTitle":"Merge pull request #28 from bryanyee33/project-website-init","messageBody":"Initialize project website with MarkBind","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"cd56f158d4e686119810a45a4050003f0cafc211","isMergeCommit":false,"messageTitle":"Make fields in Name private","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":7},"test-code":{"insertions":14,"deletions":20}}},{"hash":"02dd981ed4dedde7789d6f58a2e2c868b1fd663c","isMergeCommit":false,"messageTitle":"Privatize more attributes and methods","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":20,"deletions":17},"test-code":{"insertions":74,"deletions":74}}},{"hash":"2b6c4aa20ea4904fad6c70cec11ecc3d47e94801","isMergeCommit":false,"messageTitle":"Privatize fields in Tag","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":4},"test-code":{"insertions":13,"deletions":6}}},{"hash":"74b0eb1a39f8cb73c686f9d054bf4a6a0938a31c","isMergeCommit":false,"messageTitle":"Privatize all MESSAGE_CONSTRAINTS","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":7},"test-code":{"insertions":25,"deletions":28}}},{"hash":"a005006269b72b3cc6273640410a08349bcb6997","isMergeCommit":false,"messageTitle":"Rename methods to isValid","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":10}}},{"hash":"56635cb8dbfd4621faa14584de48627956a4e3a3","isMergeCommit":false,"messageTitle":"Update AboutUs.md and add portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":7}}},{"hash":"89d47b8c755f81aca2d03394af593d169534f3de","isMergeCommit":false,"messageTitle":"Add profile picture and portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":0}}},{"hash":"9cdd2decabc7eed61aca479406f7fe4e60b89868","isMergeCommit":true,"messageTitle":"Merge pull request #35 from bryanyee33/project-website-aboutus","messageBody":"Update initial AboutUs page for Bryan","fileTypesAndContributionMap":{}},{"hash":"f88b055af2cecebf954b59ddd3a78cea84805af2","isMergeCommit":true,"messageTitle":"Resolve merge conflicts","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"21fd842c2af95ce637df502f45465247e9124dac","isMergeCommit":false,"messageTitle":"Update portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}},{"hash":"39d4b23cda85b2b3bc442f2408b2cd9c85e6aee4","isMergeCommit":false,"messageTitle":"Remove \u003d\u003d\u003d\u003d from AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"650f5fee9976390f2ad7dfca6146e9743932461f","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"27f364855ec1d112e11f819d8e69b64cffb34a09","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into refactor-models","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f9deea34e99d3efa34f711ebfa7d916630419da8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into project-website-init","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3cfea6f4de92fbab7711fec3a4b06bd87a22f35b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from bryanyee33/project-website-init","messageBody":"Update description of AssetBook-3","fileTypesAndContributionMap":{}},{"hash":"0225279c119bc6e336bcec56e6687142d51a8fa0","isMergeCommit":false,"messageTitle":"Add non-functional requirements to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":5}}},{"hash":"032357edec6e697b14ea53acf4198aacaa13aa4c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"274d2a560db350139f8280309ab756859a77af77","isMergeCommit":true,"messageTitle":"Merge pull request #38 from aureliony/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"ddba7ae0c2d49b3df0aaf4caf7de3ea3ff0b2e6c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-dg-nfr","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"35c601881c0316786968e10068740c55a0f1bd1d","isMergeCommit":true,"messageTitle":"Merge pull request #39 from aureliony/update-dg-nfr","messageBody":"Add non-functional requirements to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8966c813d77d678b4d565374cf731662559b385b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into refactor-models","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"32215b98e9b9b20da0076ad5e953501700d096c7","isMergeCommit":true,"messageTitle":"Merge pull request #32 from aureliony/refactor-models","messageBody":"Refactor models: privatize attributes and methods in Person fields","fileTypesAndContributionMap":{}}]}],"bryanyee33":[{"date":"2024-02-29","commitResults":[{"hash":"8f4d0aff142753d3ad90523464cfac615c1935fb","isMergeCommit":true,"messageTitle":"Merge pull request #8 from aureliony/refactor-models","messageBody":"Refactor models component","fileTypesAndContributionMap":{}},{"hash":"e51ece70e015f27ffb3af901fa2132ab2a5bd3fa","isMergeCommit":false,"messageTitle":"Update default page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":8}}}]},{"date":"2024-03-02","commitResults":[{"hash":"c335bd088f4224dfa0b052a414031cf0050f9053","isMergeCommit":false,"messageTitle":"Add initial about page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":6}}},{"hash":"d353872a522ed43c983663407f39a75c53d8687b","isMergeCommit":false,"messageTitle":"Update description of AssetBook-3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"692a531510343aa9b2fafb783549930fa218e90c","isMergeCommit":true,"messageTitle":"Merge pull request #33 from aureliony/update-aboutus","messageBody":"Update AboutUs.md and add portfolio page for aureliony","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"7469a1c237dc636ce41647b13c5eec51535ad8cc","isMergeCommit":true,"messageTitle":"Merge pull request #44 from yisiox/branch-update-readme","messageBody":"Update AboutUs for yisiox","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"darkvoid32":{"docs":93,"functional-code":0,"test-code":0},"yisiox":{"docs":52,"functional-code":0,"test-code":0},"rizkidelta":{"docs":0,"functional-code":0,"test-code":0},"aureliony":{"docs":87,"functional-code":290,"test-code":218},"bryanyee33":{"docs":52,"functional-code":0,"test-code":0}},"authorContributionVariance":{"darkvoid32":1750.5557,"yisiox":396.0,"rizkidelta":0.0,"aureliony":48734.22,"bryanyee33":248.40971},"authorDisplayNameMap":{"darkvoid32":"CS2103T-W12-3 TANG..TONG","yisiox":"CS2103T-W12-3 GUK ..IONG","rizkidelta":"CS2103T-W12-3 MUHA..UAJI","aureliony":"CS2103T-W12-3 LEON.. YEW","bryanyee33":"CS2103T-W12-3 YEE ..RYAN"}} +{"authorDailyContributionsMap":{"darkvoid32":[{"date":"2024-02-27","commitResults":[{"hash":"dfb1e3d9d11c8ec57f1e75b774696544e9b2405e","isMergeCommit":true,"messageTitle":"Merge pull request #7 from aureliony/refactor","messageBody":"Refactor existing JSON serialization and deserialization code to our current uses.","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"67d9d583455f4ce2db3235341841ea1ec9abe957","isMergeCommit":false,"messageTitle":"Update AboutUs page for Yetong","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":6}}},{"hash":"bf7a5eefde3db6e23c9809a814cd95305b0ab69b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs-Yetong","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1d0a526712f87e29e4dd6028d6bccbb540515178","isMergeCommit":true,"messageTitle":"Merge pull request #9 from darkvoid32/branch-AboutUs-Yetong","messageBody":"Update AboutUs page for Yetong","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"374dacd516ecffee8ee77a039385493d75f281d6","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Replaced Ui.png with our new Ui mockup.\nUpdated description to what our application does\n\nMore details can be added later when UG and / or DG is created\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":11}}},{"hash":"e4bb811ff5d15001c99c5d251642eeb7cb06b75a","isMergeCommit":false,"messageTitle":"Fixed Yetong\u0027s AboutUs page and added Rizki\u0027s","messageBody":"Changed jpg file to png to fix Yetong\u0027s AboutUs page.\nChanged Yetong\u0027s page to match other team members.\nAdded Rizki\u0027s page and AboutUs section.\n","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":44}}}]}],"yisiox":[{"date":"2024-03-04","commitResults":[{"hash":"ecb74c12be5dc1d8dde290c0bf5882de2d49e6c0","isMergeCommit":false,"messageTitle":"Update AboutUs for yisiox","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":18}}},{"hash":"a730973d1d28ec36f459da79b1fc12f6329f3038","isMergeCommit":false,"messageTitle":"Fix portfolio link and grammar","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}}]},{"date":"2024-03-06","commitResults":[{"hash":"6d33263afa49412aebff9d20d807a4dce7684fce","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-dg-nfr","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2aa36decec551360661bf32a12b10b46116b94e9","isMergeCommit":true,"messageTitle":"Merge pull request #45 from aureliony/update-dg-nfr","messageBody":"Fix DG NFR formatting and remove old team members","fileTypesAndContributionMap":{}}]}],"rizkidelta":[{"date":"2024-03-04","commitResults":[{"hash":"1d4aeaba064ee4bc01ddcafb8959365f7354a6ff","isMergeCommit":true,"messageTitle":"Merge pull request #41 from darkvoid32/branch-Update-README","messageBody":"Updated README.md","fileTypesAndContributionMap":{}},{"hash":"a4a550ff291ae27ed793e405731c985f418491f9","isMergeCommit":true,"messageTitle":"Merge pull request #43 from darkvoid32/branch-Update-README-Rizki","messageBody":"Fixed Yetong\u0027s AboutUs page and added Rizki\u0027s","fileTypesAndContributionMap":{}}]}],"aureliony":[{"date":"2024-02-26","commitResults":[{"hash":"f50f8265764a4237a560cd39841cbc0d1a6a2ad2","isMergeCommit":false,"messageTitle":"Remove JsonAdaptedPerson and JsonAdaptedTag","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":169},"test-code":{"insertions":0,"deletions":110}}},{"hash":"5cf15e318fbc4f8362dfd4d0305070c082e59f9d","isMergeCommit":false,"messageTitle":"Move Json annotations into Person and Tag","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":27,"deletions":22}}},{"hash":"2eeeb964416924bf0f9a7df3216bc6140f2b9cf9","isMergeCommit":false,"messageTitle":"Revert ObjectMapper changes","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":24,"deletions":1}}},{"hash":"cd6d7fa261ad6227f6f67a612d77290f442ea665","isMergeCommit":false,"messageTitle":"Fix JsonSerializableAddressBookTest","messageBody":"","fileTypesAndContributionMap":{"test-code":{"insertions":4,"deletions":4}}},{"hash":"a6de5b5404adc81bb9300dd5bc483fce6b4b9774","isMergeCommit":false,"messageTitle":"Make AddressBook serializable","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":15,"deletions":12}}},{"hash":"a69b4621c80562939abf380a5b899d028a44668c","isMergeCommit":false,"messageTitle":"Add JsonValue notations","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":49,"deletions":20}}},{"hash":"3670249bee606c37c8a150ed8c5095a46300548d","isMergeCommit":false,"messageTitle":"Remove JsonSerializableAddressBook","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":58},"test-code":{"insertions":0,"deletions":47}}},{"hash":"1da3353380d9649b2d00f714e7482dffe45ed587","isMergeCommit":false,"messageTitle":"Remove unnecessary annotations","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":17}}}]},{"date":"2024-02-27","commitResults":[{"hash":"711f3460ddcf56d80ab5a29a49cc6be300d46c24","isMergeCommit":false,"messageTitle":"Add custom deserializer for UniquePersonList","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":58,"deletions":3}}},{"hash":"39665b57f1a551d894a56dcf246187d1785ba208","isMergeCommit":false,"messageTitle":"Cleanup and fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":5,"deletions":3}}},{"hash":"ffc7ed0bd22ec4499e48bfcb88e2a831aa50d412","isMergeCommit":false,"messageTitle":"Refactor variable names","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":35,"deletions":44},"test-code":{"insertions":10,"deletions":10}}},{"hash":"33f7ebb6299e173dadc059430fc68fd2ed24bcea","isMergeCommit":false,"messageTitle":"Cleanup Phone.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":5}}},{"hash":"583b7311eb215fd73f9c91f63f692748c2ba59f0","isMergeCommit":false,"messageTitle":"Remove unnecessary getters","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":21}}},{"hash":"7ba691f1ef9f60ea3175a0f8ada5da2195b2351e","isMergeCommit":false,"messageTitle":"Remove unnecessary annotation","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":2}}},{"hash":"e2e21bf40d7cc7b11a40c54edccc0d9bc93b5243","isMergeCommit":false,"messageTitle":"Add null check for tagNames","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":4,"deletions":2}}},{"hash":"10d3015ffc6c5c59058652b212327aa5bda33807","isMergeCommit":false,"messageTitle":"Remove non-null requirement for tagNames","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":1}}},{"hash":"db5664d596daf515c62e23232a749d738619a7e6","isMergeCommit":false,"messageTitle":"Move Person fields into separate packages","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":0},"other":{"insertions":0,"deletions":0}}}]},{"date":"2024-02-28","commitResults":[{"hash":"94f582cc03a50ccca03e16f05648c833d47eb5b4","isMergeCommit":false,"messageTitle":"Abstract out Set\u003cTag\u003e into new Tags class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":155,"deletions":105},"test-code":{"insertions":52,"deletions":71}}},{"hash":"64030dda160eb7d9d8d25d23bc22589d492b7560","isMergeCommit":false,"messageTitle":"Fix passing null into Person.java constructor","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":18},"test-code":{"insertions":23,"deletions":23}}},{"hash":"977232187a797112e4c9e9b99222b5018265c917","isMergeCommit":false,"messageTitle":"Fix remaining testcases","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":27,"deletions":15},"test-code":{"insertions":11,"deletions":7}}},{"hash":"f0db2f933ede34567c506c7530b5d00b2334c380","isMergeCommit":false,"messageTitle":"Fix checkstyle","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":7},"test-code":{"insertions":1,"deletions":1}}},{"hash":"203ad1f68a26f417863ae4632e2a84ecbd92f76f","isMergeCommit":false,"messageTitle":"Add TagTest","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":4,"deletions":12},"test-code":{"insertions":26,"deletions":0}}}]},{"date":"2024-02-29","commitResults":[{"hash":"804bd736b2d34b9b13ac2b67ea821c1037afa2db","isMergeCommit":false,"messageTitle":"Remove Optional and Mandatory packages","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":26,"deletions":43},"other":{"insertions":15,"deletions":15},"test-code":{"insertions":30,"deletions":30}}}]},{"date":"2024-03-01","commitResults":[{"hash":"a7510bc445736eea88bfa52a26ac2729fb87c5c8","isMergeCommit":true,"messageTitle":"Merge pull request #28 from bryanyee33/project-website-init","messageBody":"Initialize project website with MarkBind","fileTypesAndContributionMap":{}}]},{"date":"2024-03-02","commitResults":[{"hash":"cd56f158d4e686119810a45a4050003f0cafc211","isMergeCommit":false,"messageTitle":"Make fields in Name private","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":8,"deletions":7},"test-code":{"insertions":14,"deletions":20}}},{"hash":"02dd981ed4dedde7789d6f58a2e2c868b1fd663c","isMergeCommit":false,"messageTitle":"Privatize more attributes and methods","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":20,"deletions":17},"test-code":{"insertions":74,"deletions":74}}},{"hash":"2b6c4aa20ea4904fad6c70cec11ecc3d47e94801","isMergeCommit":false,"messageTitle":"Privatize fields in Tag","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":4},"test-code":{"insertions":13,"deletions":6}}},{"hash":"74b0eb1a39f8cb73c686f9d054bf4a6a0938a31c","isMergeCommit":false,"messageTitle":"Privatize all MESSAGE_CONSTRAINTS","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":6,"deletions":7},"test-code":{"insertions":25,"deletions":28}}},{"hash":"a005006269b72b3cc6273640410a08349bcb6997","isMergeCommit":false,"messageTitle":"Rename methods to isValid","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":10}}},{"hash":"56635cb8dbfd4621faa14584de48627956a4e3a3","isMergeCommit":false,"messageTitle":"Update AboutUs.md and add portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":7}}},{"hash":"89d47b8c755f81aca2d03394af593d169534f3de","isMergeCommit":false,"messageTitle":"Add profile picture and portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":0}}},{"hash":"9cdd2decabc7eed61aca479406f7fe4e60b89868","isMergeCommit":true,"messageTitle":"Merge pull request #35 from bryanyee33/project-website-aboutus","messageBody":"Update initial AboutUs page for Bryan","fileTypesAndContributionMap":{}},{"hash":"f88b055af2cecebf954b59ddd3a78cea84805af2","isMergeCommit":true,"messageTitle":"Resolve merge conflicts","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"21fd842c2af95ce637df502f45465247e9124dac","isMergeCommit":false,"messageTitle":"Update portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}},{"hash":"39d4b23cda85b2b3bc442f2408b2cd9c85e6aee4","isMergeCommit":false,"messageTitle":"Remove \u003d\u003d\u003d\u003d from AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"650f5fee9976390f2ad7dfca6146e9743932461f","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-03","commitResults":[{"hash":"27f364855ec1d112e11f819d8e69b64cffb34a09","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into refactor-models","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f9deea34e99d3efa34f711ebfa7d916630419da8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into project-website-init","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3cfea6f4de92fbab7711fec3a4b06bd87a22f35b","isMergeCommit":true,"messageTitle":"Merge pull request #36 from bryanyee33/project-website-init","messageBody":"Update description of AssetBook-3","fileTypesAndContributionMap":{}},{"hash":"0225279c119bc6e336bcec56e6687142d51a8fa0","isMergeCommit":false,"messageTitle":"Add non-functional requirements to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":5}}},{"hash":"032357edec6e697b14ea53acf4198aacaa13aa4c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-aboutus","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"274d2a560db350139f8280309ab756859a77af77","isMergeCommit":true,"messageTitle":"Merge pull request #38 from aureliony/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"ddba7ae0c2d49b3df0aaf4caf7de3ea3ff0b2e6c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-dg-nfr","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"35c601881c0316786968e10068740c55a0f1bd1d","isMergeCommit":true,"messageTitle":"Merge pull request #39 from aureliony/update-dg-nfr","messageBody":"Add non-functional requirements to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8966c813d77d678b4d565374cf731662559b385b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into refactor-models","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"32215b98e9b9b20da0076ad5e953501700d096c7","isMergeCommit":true,"messageTitle":"Merge pull request #32 from aureliony/refactor-models","messageBody":"Refactor models: privatize attributes and methods in Person fields","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"52e700575c3b491e32273781d8120fd62acadaff","isMergeCommit":false,"messageTitle":"Fix DG NFR formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":35,"deletions":35}}},{"hash":"706d80cc8a626842035fa9dcf113e203ea8c8261","isMergeCommit":false,"messageTitle":"Remove old team members","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":46}}}]},{"date":"2024-03-06","commitResults":[{"hash":"45daf3182dfb100542206d762b8533d08488b6f9","isMergeCommit":true,"messageTitle":"Merge PR #53 from bryanyee33/48-dev-guide-user-stories-use-cases","messageBody":"Add target user profile, value proposition, user stories, user cases","fileTypesAndContributionMap":{}}]}],"bryanyee33":[{"date":"2024-02-29","commitResults":[{"hash":"8f4d0aff142753d3ad90523464cfac615c1935fb","isMergeCommit":true,"messageTitle":"Merge pull request #8 from aureliony/refactor-models","messageBody":"Refactor models component","fileTypesAndContributionMap":{}},{"hash":"e51ece70e015f27ffb3af901fa2132ab2a5bd3fa","isMergeCommit":false,"messageTitle":"Update default page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":8}}}]},{"date":"2024-03-02","commitResults":[{"hash":"c335bd088f4224dfa0b052a414031cf0050f9053","isMergeCommit":false,"messageTitle":"Add initial about page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":6}}},{"hash":"d353872a522ed43c983663407f39a75c53d8687b","isMergeCommit":false,"messageTitle":"Update description of AssetBook-3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"692a531510343aa9b2fafb783549930fa218e90c","isMergeCommit":true,"messageTitle":"Merge pull request #33 from aureliony/update-aboutus","messageBody":"Update AboutUs.md and add portfolio page for aureliony","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"7469a1c237dc636ce41647b13c5eec51535ad8cc","isMergeCommit":true,"messageTitle":"Merge pull request #44 from yisiox/branch-update-readme","messageBody":"Update AboutUs for yisiox","fileTypesAndContributionMap":{}},{"hash":"5fa478cbeb617548383c49bdd08a004ed9848f70","isMergeCommit":false,"messageTitle":"Update product scope and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":27,"deletions":11}}}]},{"date":"2024-03-06","commitResults":[{"hash":"68fa075373d0349e191aa008afc65bb1fc0da14a","isMergeCommit":false,"messageTitle":"Add use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":15}}}]}]},"authorFileTypeContributionMap":{"darkvoid32":{"docs":93,"functional-code":0,"test-code":0},"yisiox":{"docs":52,"functional-code":0,"test-code":0},"rizkidelta":{"docs":0,"functional-code":0,"test-code":0},"aureliony":{"docs":87,"functional-code":290,"test-code":218},"bryanyee33":{"docs":105,"functional-code":0,"test-code":0}},"authorContributionVariance":{"darkvoid32":1634.8405,"yisiox":368.09467,"rizkidelta":0.0,"aureliony":45165.33,"bryanyee33":381.30176},"authorDisplayNameMap":{"darkvoid32":"CS2103T-W12-3 TANG..TONG","yisiox":"CS2103T-W12-3 GUK ..IONG","rizkidelta":"CS2103T-W12-3 MUHA..UAJI","aureliony":"CS2103T-W12-3 LEON.. YEW","bryanyee33":"CS2103T-W12-3 YEE ..RYAN"}} diff --git a/AY2324S2-CS2103T-W13-1_tp_master/authorship.json b/AY2324S2-CS2103T-W13-1_tp_master/authorship.json index fe51488c..a8fbab89 100644 --- a/AY2324S2-CS2103T-W13-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W13-1_tp_master/authorship.json @@ -1 +1 @@ -[] +[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"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":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"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":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"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":"-"},"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":{"Joseph31416":3,"-":56}}] diff --git a/AY2324S2-CS2103T-W13-1_tp_master/commits.json b/AY2324S2-CS2103T-W13-1_tp_master/commits.json index 698d8f99..28363237 100644 --- a/AY2324S2-CS2103T-W13-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W13-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"marcus-ny":[],"xiaorui-ui":[],"Joseph31416":[],"kjw142857":[],"narwhalsilent":[]},"authorFileTypeContributionMap":{"marcus-ny":{"docs":0,"functional-code":0,"test-code":0},"xiaorui-ui":{"docs":0,"functional-code":0,"test-code":0},"Joseph31416":{"docs":0,"functional-code":0,"test-code":0},"kjw142857":{"docs":0,"functional-code":0,"test-code":0},"narwhalsilent":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"marcus-ny":0.0,"xiaorui-ui":0.0,"Joseph31416":0.0,"kjw142857":0.0,"narwhalsilent":0.0},"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":[],"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}}}]}],"kjw142857":[],"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":{}}]}]},"authorFileTypeContributionMap":{"marcus-ny":{"docs":0,"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":0,"functional-code":0,"test-code":0},"narwhalsilent":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"marcus-ny":0.0,"xiaorui-ui":0.0,"Joseph31416":2.5562131,"kjw142857":0.0,"narwhalsilent":0.0},"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-2_tp_master/authorship.json b/AY2324S2-CS2103T-W13-2_tp_master/authorship.json index fa937a75..0b66befb 100644 --- a/AY2324S2-CS2103T-W13-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W13-2_tp_master/authorship.json @@ -1 +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":"miffi"},"content":"OfficeHarbor (OH) is a **desktop app for managing a tech firm\u0027s teams, 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, OH can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"1. Download the latest `officeharbor.jar` from [here](https://github.com/AY2324S2-CS2103T-W13-2/tp/releases).","lastModifiedDate":"2024-02-24"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"miffi"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your OH.","lastModifiedDate":"2024-02-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"miffi"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar officeharbor.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"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 OH.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"Adds a person to OH.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"Shows a list of all persons in OH.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"Edits an existing person in OH.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"Deletes the specified person from OH.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"* `list` followed by `delete 2` deletes the 2nd person in OH.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"Clears all entries from OH.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"OfficeHarbor 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-24"},{"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":"miffi"},"content":"OfficeHarbor data are saved automatically as a JSON file `[JAR file location]/data/officeharbor.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"If your changes to the data file makes its format invalid, OfficeHarbor 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-24"},{"lineNumber":166,"author":{"gitId":"miffi"},"content":"Furthermore, certain edits can cause the OfficeHarbor 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-24"},{"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":"miffi"},"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 OfficeHarbor home folder.","lastModifiedDate":"2024-02-24"},{"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":{"miffi":16,"-":182}},{"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":"miffi"},"content":" content: \"OfficeHarbor\";","lastModifiedDate":"2024-02-24"},{"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":{"miffi":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":"miffi"},"content":"title: OfficeHarbor","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"**OfficeHarbor is a desktop application for managing a tech firm\u0027s teams.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"miffi"},"content":"* If you are interested in using OfficeHarbor, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-02-24"},{"lineNumber":14,"author":{"gitId":"miffi"},"content":"* If you are interested about developing OfficeHarbor, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-02-24"},{"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":{"miffi":4,"-":15}}] +[{"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":"JukeBoxK"},"content":"OfficeHarbor (OH) is a **desktop app for managing the contacts of a tech firm\u0027s teams, 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, OH can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-02-29"},{"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":"JukeBoxK"},"content":"2. Download the latest `officeharbor.jar` from [here](https://github.com/AY2324S2-CS2103T-W13-2/tp/releases).","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"JukeBoxK"},"content":"3. Copy the file to the folder you want to use as the _home folder_ for your OH.","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"JukeBoxK"},"content":"4. (a) Double-click on the `officeharbor.jar` file to run the application.","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"JukeBoxK"},"content":" (b) (Or) Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar officeharbor.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"JukeBoxK"},"content":"5. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"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":"miffi"},"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 OH.","lastModifiedDate":"2024-02-24"},{"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":"JukeBoxK"},"content":"6. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2024-02-29"},{"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":"JukeBoxK"},"content":"* Words enclosed between diamond brackets `\u003c\u003e`, are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"JukeBoxK"},"content":" e.g. in `add n/\u003cname\u003e`, `\u003cname\u003e` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2024-02-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"JukeBoxK"},"content":"* Parameters can be in any order for adding a contact.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":53,"author":{"gitId":"JukeBoxK"},"content":" e.g. if the command specifies `n/\u003cname\u003e p/\u003cphone number\u003e`, `p/\u003cphone number\u003e n/\u003cname\u003e` is also acceptable.","lastModifiedDate":"2024-02-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"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":56,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":58,"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":59,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"JukeBoxK"},"content":"Shows a message explaining how to access the help page.","lastModifiedDate":"2024-02-29"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"JukeBoxK"},"content":"Adds a contact with the input details to OH.","lastModifiedDate":"2024-02-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"JukeBoxK"},"content":"Format: `add n/\u003cname\u003e p/\u003cphone number\u003e e/\u003cemail address\u003e a/\u003caddress\u003e`","lastModifiedDate":"2024-02-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"JukeBoxK"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"JukeBoxK"},"content":"All components are necessary.","lastModifiedDate":"2024-02-29"},{"lineNumber":78,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"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":82,"author":{"gitId":"JukeBoxK"},"content":"* `add n/Virat Kohli p/98765432 e/virat@gmail.com a/Altamount Road, block 10, #05-02`","lastModifiedDate":"2024-02-29"},{"lineNumber":83,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":84,"author":{"gitId":"JukeBoxK"},"content":"Output:","lastModifiedDate":"2024-02-29"},{"lineNumber":85,"author":{"gitId":"JukeBoxK"},"content":"The message “A new contact `name` has been added to the list. Name: `\u003cname\u003e`, Phone: `\u003cphone number\u003e`, Email: `\u003cemail\u003e`, Address: `\u003caddress\u003e`.” will be shown. ","lastModifiedDate":"2024-02-29"},{"lineNumber":86,"author":{"gitId":"JukeBoxK"},"content":"A new contact entry with the given user will be displayed in the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":87,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":88,"author":{"gitId":"JukeBoxK"},"content":"![add](images/user-guide/add_mock_output.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"JukeBoxK"},"content":"Shows a list of all contacts in OH.","lastModifiedDate":"2024-02-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"JukeBoxK"},"content":"Output:","lastModifiedDate":"2024-02-29"},{"lineNumber":97,"author":{"gitId":"JukeBoxK"},"content":"A list of added contacts if any in the form of a scrollable pane will be shown. ","lastModifiedDate":"2024-02-29"},{"lineNumber":98,"author":{"gitId":"JukeBoxK"},"content":"The contacts are listed in the order in which they are added.","lastModifiedDate":"2024-02-29"},{"lineNumber":99,"author":{"gitId":"JukeBoxK"},"content":"The message \"Empty list\" is shown when there is nothing added.","lastModifiedDate":"2024-02-29"},{"lineNumber":100,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":101,"author":{"gitId":"JukeBoxK"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2024-02-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"JukeBoxK"},"content":"Deletes the specified contact from OH.","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"JukeBoxK"},"content":"Format: `delete \u003cid\u003e`","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"JukeBoxK"},"content":"* Deletes the person at the specified `\u003cid\u003e`.","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"JukeBoxK"},"content":"* The id refers to the index number shown in the contact list.","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"JukeBoxK"},"content":"* The id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"JukeBoxK"},"content":"* `delete 2` deletes the 2nd person of the contact list from OH.","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"JukeBoxK"},"content":"Output:","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"JukeBoxK"},"content":"The message \"Contact `name` has been deleted. Name: `name`, Phone: `phone number`, Email: `email`, Address: `address`.” will be shown.","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"JukeBoxK"},"content":"The entry with the given id will disappear from the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"JukeBoxK"},"content":"![delete](images/user-guide/delete_mock_output.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"JukeBoxK"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2024-02-29"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"JukeBoxK"},"content":"Clears all entries from OH.","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"JukeBoxK"},"content":"Format: `clear`","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"JukeBoxK"},"content":"Output:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"JukeBoxK"},"content":"The message \"Address book has been cleared!\" will be shown.","lastModifiedDate":"2024-02-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"JukeBoxK"},"content":"### Tagging a Contact : `tag`","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"JukeBoxK"},"content":"Tags the specified contact with the input tag name.","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"JukeBoxK"},"content":"* Tags the person at the specified `\u003cid\u003e`.","lastModifiedDate":"2024-02-29"},{"lineNumber":134,"author":{"gitId":"JukeBoxK"},"content":"* The id refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-02-29"},{"lineNumber":135,"author":{"gitId":"JukeBoxK"},"content":"* The id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"JukeBoxK"},"content":"Format: `tag \u003cid\u003e | \u003ctag name\u003e`","lastModifiedDate":"2024-02-29"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"JukeBoxK"},"content":"Example:","lastModifiedDate":"2024-02-29"},{"lineNumber":140,"author":{"gitId":"JukeBoxK"},"content":"`tag 2 | friends`","lastModifiedDate":"2024-02-29"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"JukeBoxK"},"content":"Output:","lastModifiedDate":"2024-02-29"},{"lineNumber":143,"author":{"gitId":"JukeBoxK"},"content":"The message \"The following contact has been tagged with `\u003ctag name\u003e`: `contact info`.” will be shown, ","lastModifiedDate":"2024-02-29"},{"lineNumber":144,"author":{"gitId":"JukeBoxK"},"content":"where contact info is all the information of the contact.","lastModifiedDate":"2024-02-29"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"JukeBoxK"},"content":"![tag](images/user-guide/tag_mock_output.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":147,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":148,"author":{"gitId":"JukeBoxK"},"content":"### Deleting a tag : `delete-tag`","lastModifiedDate":"2024-02-29"},{"lineNumber":149,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":150,"author":{"gitId":"JukeBoxK"},"content":"Deletes the specified tag from the specified contact","lastModifiedDate":"2024-02-29"},{"lineNumber":151,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":152,"author":{"gitId":"JukeBoxK"},"content":"* Delete the specified tag of the person at the specified `\u003cid\u003e`.","lastModifiedDate":"2024-02-29"},{"lineNumber":153,"author":{"gitId":"JukeBoxK"},"content":"* The id refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-02-29"},{"lineNumber":154,"author":{"gitId":"JukeBoxK"},"content":"* The id **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":155,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"JukeBoxK"},"content":"Format: `delete-tag \u003cid\u003e | \u003ctag name\u003e`","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"JukeBoxK"},"content":"Output:","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"JukeBoxK"},"content":"The message \"The tag `\u003ctag name\u003e` has been removed from contact: `contact info`.\" will be shown,","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"JukeBoxK"},"content":"where contact info is all the information of the contact. ","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"JukeBoxK"},"content":"The list entry of the user with \u003cid\u003e will not have the tag anymore.","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"JukeBoxK"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"JukeBoxK"},"content":"![delete-tag](images/user-guide/delete-tag_mock_output.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"miffi"},"content":"OfficeHarbor 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-24"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":177,"author":{"gitId":"miffi"},"content":"OfficeHarbor data are saved automatically as a JSON file `[JAR file location]/data/officeharbor.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-02-24"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":179,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":180,"author":{"gitId":"miffi"},"content":"If your changes to the data file makes its format invalid, OfficeHarbor 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-24"},{"lineNumber":181,"author":{"gitId":"JukeBoxK"},"content":"Furthermore, certain edits can cause the OfficeHarbor 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-29"},{"lineNumber":182,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":184,"author":{"gitId":"JukeBoxK"},"content":"### Filtering tags `[coming in v1.3]`","lastModifiedDate":"2024-02-29"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"miffi"},"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 OfficeHarbor home folder.","lastModifiedDate":"2024-02-24"},{"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":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":199,"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":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":201,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":203,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"JukeBoxK"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-29"},{"lineNumber":206,"author":{"gitId":"JukeBoxK"},"content":"|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-02-29"},{"lineNumber":207,"author":{"gitId":"JukeBoxK"},"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":"2024-02-29"},{"lineNumber":208,"author":{"gitId":"JukeBoxK"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-02-29"},{"lineNumber":209,"author":{"gitId":"JukeBoxK"},"content":"| **Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3` |","lastModifiedDate":"2024-02-29"},{"lineNumber":210,"author":{"gitId":"JukeBoxK"},"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":"2024-02-29"},{"lineNumber":211,"author":{"gitId":"JukeBoxK"},"content":"| **Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake` |","lastModifiedDate":"2024-02-29"},{"lineNumber":212,"author":{"gitId":"JukeBoxK"},"content":"| **List** | `list` |","lastModifiedDate":"2024-02-29"},{"lineNumber":213,"author":{"gitId":"JukeBoxK"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"JukeBoxK":85,"miffi":5,"-":123}},{"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":"miffi"},"content":" content: \"OfficeHarbor\";","lastModifiedDate":"2024-02-24"},{"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":{"miffi":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":"miffi"},"content":"title: OfficeHarbor","lastModifiedDate":"2024-02-24"},{"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":"miffi"},"content":"**OfficeHarbor is a desktop application for managing a tech firm\u0027s teams.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-02-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"miffi"},"content":"* If you are interested in using OfficeHarbor, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-02-24"},{"lineNumber":14,"author":{"gitId":"miffi"},"content":"* If you are interested about developing OfficeHarbor, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-02-24"},{"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":{"miffi":4,"-":15}}] diff --git a/AY2324S2-CS2103T-W13-2_tp_master/commits.json b/AY2324S2-CS2103T-W13-2_tp_master/commits.json index d8961cd8..43e9b531 100644 --- a/AY2324S2-CS2103T-W13-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-W13-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"The-Dudeski":[],"Derekljh":[],"radeon2525":[],"miffi":[{"date":"2024-02-24","commitResults":[{"hash":"c2e81d65d4cccdb3ed49d85508e1a72a4fbc4b86","isMergeCommit":false,"messageTitle":"Rename doc references of AB-3 to OfficeHarbor","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}},{"hash":"28789c919dd4b31b65c7aa8ed09a2dd87cc21ded","isMergeCommit":true,"messageTitle":"Merge pull request #1 from miffi/rename-codebase","messageBody":"Rename doc references of AB-3 to OfficeHarbor","fileTypesAndContributionMap":{}}]}],"JukeBoxK":[]},"authorFileTypeContributionMap":{"The-Dudeski":{"docs":0,"functional-code":0,"test-code":0},"Derekljh":{"docs":0,"functional-code":0,"test-code":0},"radeon2525":{"docs":0,"functional-code":0,"test-code":0},"miffi":{"docs":20,"functional-code":0,"test-code":0,"other":1},"JukeBoxK":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"The-Dudeski":0.0,"Derekljh":0.0,"radeon2525":0.0,"miffi":400.0,"JukeBoxK":0.0},"authorDisplayNameMap":{"The-Dudeski":"CS2103T-W13-2 DUDE..NZIO","Derekljh":"CS2103T-W13-2 LEON..EREK","radeon2525":"CS2103T-W13-2 MAHI..SHIM","miffi":"CS2103T-W13-2 AHMA..AQUE","JukeBoxK":"CS2103T-W13-2 KYAW..YINT"}} +{"authorDailyContributionsMap":{"The-Dudeski":[],"Derekljh":[],"radeon2525":[],"miffi":[{"date":"2024-02-24","commitResults":[{"hash":"c2e81d65d4cccdb3ed49d85508e1a72a4fbc4b86","isMergeCommit":false,"messageTitle":"Rename doc references of AB-3 to OfficeHarbor","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}},{"hash":"28789c919dd4b31b65c7aa8ed09a2dd87cc21ded","isMergeCommit":true,"messageTitle":"Merge pull request #1 from miffi/rename-codebase","messageBody":"Rename doc references of AB-3 to OfficeHarbor","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"c0eb71a6449f317ce92e27565041be7ecf07b425","isMergeCommit":true,"messageTitle":"Merge pull request #8 from JukeBoxK/master","messageBody":"Update the User Guide","fileTypesAndContributionMap":{}}]}],"JukeBoxK":[{"date":"2024-02-29","commitResults":[{"hash":"221ddb4c24fb3fc650d1590e6cce283eba688a4c","isMergeCommit":false,"messageTitle":"Update the User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":85,"deletions":70}}}]}]},"authorFileTypeContributionMap":{"The-Dudeski":{"docs":0,"functional-code":0,"test-code":0},"Derekljh":{"docs":0,"functional-code":0,"test-code":0},"radeon2525":{"docs":0,"functional-code":0,"test-code":0},"miffi":{"docs":9,"functional-code":0,"test-code":0,"other":1},"JukeBoxK":{"docs":85,"functional-code":0,"test-code":0}},"authorContributionVariance":{"The-Dudeski":0.0,"Derekljh":0.0,"radeon2525":0.0,"miffi":113.60942,"JukeBoxK":1705.9172},"authorDisplayNameMap":{"The-Dudeski":"CS2103T-W13-2 DUDE..NZIO","Derekljh":"CS2103T-W13-2 LEON..EREK","radeon2525":"CS2103T-W13-2 MAHI..SHIM","miffi":"CS2103T-W13-2 AHMA..AQUE","JukeBoxK":"CS2103T-W13-2 KYAW..YINT"}} diff --git a/AY2324S2-CS2103T-W13-4_tp_master/authorship.json b/AY2324S2-CS2103T-W13-4_tp_master/authorship.json index fe51488c..78e5b98a 100644 --- a/AY2324S2-CS2103T-W13-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W13-4_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":"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 3068784e..baf851f7 100644 --- a/AY2324S2-CS2103T-W13-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-W13-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Kaya3842":[],"Yskie":[],"chin-herng":[],"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":{}}]}],"breezetall":[]},"authorFileTypeContributionMap":{"Kaya3842":{"docs":0,"functional-code":0,"test-code":0},"Yskie":{"docs":0,"functional-code":0,"test-code":0},"chin-herng":{"docs":0,"functional-code":0,"test-code":0},"nobodyishappy":{"docs":0,"functional-code":0,"test-code":0},"breezetall":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Kaya3842":0.0,"Yskie":0.0,"chin-herng":0.0,"nobodyishappy":0.0,"breezetall":0.0},"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":[],"Yskie":[],"chin-herng":[],"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}}}]}],"breezetall":[]},"authorFileTypeContributionMap":{"Kaya3842":{"docs":0,"functional-code":0,"test-code":0},"Yskie":{"docs":0,"functional-code":0,"test-code":0},"chin-herng":{"docs":0,"functional-code":0,"test-code":0},"nobodyishappy":{"docs":1,"functional-code":0,"test-code":0},"breezetall":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Kaya3842":0.0,"Yskie":0.0,"chin-herng":0.0,"nobodyishappy":0.28402367,"breezetall":0.0},"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 4fbeeb20..b806c113 100644 Binary files a/archive.zip and b/archive.zip differ diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 8614ce6d..9c02b1f4 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,42 +1,42 @@ -Mar 06, 2024 5:02:25 AM reposense.system.LogsManager addFileHandler +Mar 06, 2024 1:57:32 PM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Mar 06, 2024 5:02:25 AM reposense.parser.CsvParser validateHeader +Mar 06, 2024 1:57:32 PM 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 06, 2024 5:02:25 AM reposense.parser.RepoConfigCsvParser matchValueAndKeyword +Mar 06, 2024 1:57:32 PM 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 06, 2024 5:02:26 AM reposense.parser.CsvParser validateHeader +Mar 06, 2024 1:57:32 PM 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 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:32 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:33 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:33 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:33 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:33 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:33 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 06, 2024 5:02:26 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 06, 2024 1:57:33 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 06, 2024 5:02:26 AM reposense.parser.CsvParser validateHeader +Mar 06, 2024 1:57:33 PM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, group-config.csv, and recognized columns: Globs, Repository's Location, Group Name -Mar 06, 2024 5:02:26 AM reposense.git.GitConfig getGlobalGitLfsConfig +Mar 06, 2024 1:57:33 PM 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,1481 +52,1479 @@ 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 06, 2024 5:02:26 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-2/tp.git... -Mar 06, 2024 5:02:26 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-3/tp.git... -Mar 06, 2024 5:02:26 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... -Mar 06, 2024 5:02:26 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... -Mar 06, 2024 5:02:26 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... -Mar 06, 2024 5:02:26 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... -Mar 06, 2024 5:02:26 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... -Mar 06, 2024 5:02:26 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git to complete... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... +Mar 06, 2024 1:57:33 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git completed! -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-3/tp.git... -Mar 06, 2024 5:02:27 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator analyzeRepos INFO: [1/92] Analyzing https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git to complete... -Mar 06, 2024 5:02:27 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-4/tp.git... -Mar 06, 2024 5:02:27 AM reposense.report.ReportGenerator analyzeRepos -INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git to complete... -Mar 06, 2024 5:02:27 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 06, 2024 5:02:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:34 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:34 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-4/tp.git... +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator analyzeRepos +INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git to complete... +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-2/tp.git... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator analyzeRepos +INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! -Mar 06, 2024 5:02:27 AM reposense.report.ReportGenerator analyzeRepos -INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git to complete... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... -Mar 06, 2024 5:02:27 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator analyzeRepos INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 06, 2024 5:02:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:34 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... -Mar 06, 2024 5:02:27 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 06, 2024 1:57:34 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:34 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! -Mar 06, 2024 5:02:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! -Mar 06, 2024 5:02:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 06, 2024 1:57:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 06, 2024 5:02:28 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:35 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 06, 2024 1:57:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 06, 2024 1:57:35 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! -Mar 06, 2024 5:02:28 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:35 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:35 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 06, 2024 1:57:35 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:35 PM reposense.report.ReportGenerator analyzeRepos INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:35 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:35 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! +Mar 06, 2024 1:57:35 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git to complete... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:35 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:35 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator analyzeRepos INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator analyzeRepos INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 06, 2024 1:57:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! -Mar 06, 2024 5:02:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:36 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! +Mar 06, 2024 1:57:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator analyzeRepos -INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... -Mar 06, 2024 5:02:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator analyzeRepos +INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 06, 2024 1:57:36 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... -Mar 06, 2024 5:02:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:36 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:36 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 06, 2024 5:02:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:36 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 06, 2024 5:02:30 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:37 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) completed! -Mar 06, 2024 5:02:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 06, 2024 5:02:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 06, 2024 5:02:30 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! -Mar 06, 2024 5:02:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! -Mar 06, 2024 5:02:30 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... -Mar 06, 2024 5:02:30 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:37 PM reposense.report.ReportGenerator analyzeRepos INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 06, 2024 5:02:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... -Mar 06, 2024 5:02:30 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:30 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 06, 2024 5:02:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:37 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... +Mar 06, 2024 1:57:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! -Mar 06, 2024 5:02:30 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... -Mar 06, 2024 5:02:30 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:37 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... +Mar 06, 2024 1:57:37 PM reposense.report.ReportGenerator analyzeRepos INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 06, 2024 5:02:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:37 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... +Mar 06, 2024 1:57:37 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... -Mar 06, 2024 5:02:31 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:37 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:37 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:37 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:37 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 06, 2024 1:57:37 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 06, 2024 1:57:37 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:37 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 06, 2024 1:57:37 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! +Mar 06, 2024 1:57:37 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:37 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) completed! -Mar 06, 2024 5:02:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! -Mar 06, 2024 5:02:31 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator analyzeRepos INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-2/tp.git... -Mar 06, 2024 5:02:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git to complete... -Mar 06, 2024 5:02:31 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! -Mar 06, 2024 5:02:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! -Mar 06, 2024 5:02:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! -Mar 06, 2024 5:02:31 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator analyzeRepos INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 06, 2024 5:02:31 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-1/tp.git... -Mar 06, 2024 5:02:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git to complete... -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator analyzeRepos INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git completed! -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator analyzeRepos INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... -Mar 06, 2024 5:02:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:38 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:38 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 06, 2024 1:57:38 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 06, 2024 1:57:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 06, 2024 1:57:39 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! +Mar 06, 2024 1:57:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 06, 2024 1:57:39 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! +Mar 06, 2024 1:57:39 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 06, 2024 1:57:39 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 06, 2024 1:57:39 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! +Mar 06, 2024 1:57:39 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git completed! -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:39 PM reposense.report.ReportGenerator analyzeRepos INFO: [15/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:39 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... +Mar 06, 2024 1:57:39 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git to complete... -Mar 06, 2024 5:02:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! -Mar 06, 2024 5:02:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 06, 2024 5:02:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! -Mar 06, 2024 5:02:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator analyzeRepos INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-3/tp.git... -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator analyzeRepos -INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator analyzeRepos +INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! -Mar 06, 2024 5:02:33 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator analyzeRepos INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... -Mar 06, 2024 5:02:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... -Mar 06, 2024 5:02:34 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! +Mar 06, 2024 1:57:40 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! +Mar 06, 2024 1:57:40 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:40 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! -Mar 06, 2024 5:02:34 AM reposense.report.ReportGenerator analyzeRepos -INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator analyzeRepos +INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-1/tp.git... -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git to complete... -Mar 06, 2024 5:02:34 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator analyzeRepos +INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... -Mar 06, 2024 5:02:34 AM reposense.report.ReportGenerator analyzeRepos -INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... -Mar 06, 2024 5:02:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! -Mar 06, 2024 5:02:34 AM reposense.report.ReportGenerator analyzeRepos -INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator analyzeRepos +INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... -Mar 06, 2024 5:02:34 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... -Mar 06, 2024 5:02:35 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 06, 2024 5:02:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:41 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 06, 2024 5:02:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 06, 2024 5:02:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 06, 2024 5:02:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! -Mar 06, 2024 5:02:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 06, 2024 5:02:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! -Mar 06, 2024 5:02:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 06, 2024 5:02:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 06, 2024 5:02:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:41 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepos -INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:41 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:41 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! +Mar 06, 2024 1:57:41 PM reposense.report.ReportGenerator analyzeRepos +INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:42 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepos -INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:42 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! +Mar 06, 2024 1:57:42 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepos -INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:42 PM reposense.report.ReportGenerator analyzeRepos +INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 06, 2024 1:57:42 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator analyzeRepos +INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepos -INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... -Mar 06, 2024 5:02:36 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator analyzeRepos +INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator analyzeRepos +INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... +Mar 06, 2024 1:57:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 06, 2024 1:57:43 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 06, 2024 1:57:43 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:43 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! -Mar 06, 2024 5:02:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 06, 2024 5:02:36 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator analyzeRepos -INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator analyzeRepos -INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepos +INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... -Mar 06, 2024 5:02:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepos +INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator analyzeRepos -INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! -Mar 06, 2024 5:02:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! -Mar 06, 2024 5:02:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) completed! -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator analyzeRepos -INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepos +INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... -Mar 06, 2024 5:02:37 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git to complete... -Mar 06, 2024 5:02:37 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator analyzeRepos +INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... +Mar 06, 2024 1:57:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 06, 2024 5:02:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:44 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 06, 2024 1:57:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 06, 2024 5:02:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 06, 2024 5:02:38 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! -Mar 06, 2024 5:02:38 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! -Mar 06, 2024 5:02:38 AM reposense.report.ReportGenerator analyzeRepos -INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 06, 2024 5:02:38 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... -Mar 06, 2024 5:02:38 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... -Mar 06, 2024 5:02:38 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:45 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator analyzeRepos INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-4/tp.git... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git to complete... -Mar 06, 2024 5:02:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:39 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator analyzeRepos -INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator analyzeRepos +INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:45 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator analyzeRepos -INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... -Mar 06, 2024 5:02:39 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:39 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator analyzeRepos +INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:39 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! -Mar 06, 2024 5:02:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 06, 2024 5:02:39 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! -Mar 06, 2024 5:02:40 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:45 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... +Mar 06, 2024 1:57:45 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:45 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 06, 2024 1:57:46 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! -Mar 06, 2024 5:02:40 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:46 PM reposense.report.ReportGenerator analyzeRepos INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:46 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... -Mar 06, 2024 5:02:40 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:46 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... -Mar 06, 2024 5:02:40 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:46 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:40 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 06, 2024 1:57:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 06, 2024 1:57:46 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! +Mar 06, 2024 1:57:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:46 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! -Mar 06, 2024 5:02:40 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! -Mar 06, 2024 5:02:40 AM reposense.report.ReportGenerator analyzeRepos -INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-2/tp.git... -Mar 06, 2024 5:02:40 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git to complete... -Mar 06, 2024 5:02:40 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:47 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:40 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 06, 2024 5:02:40 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! -Mar 06, 2024 5:02:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 06, 2024 5:02:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! -Mar 06, 2024 5:02:41 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... -Mar 06, 2024 5:02:41 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:47 PM reposense.report.ReportGenerator analyzeRepos INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 06, 2024 5:02:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 06, 2024 5:02:41 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! -Mar 06, 2024 5:02:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... -Mar 06, 2024 5:02:41 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:47 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:41 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 06, 2024 5:02:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 06, 2024 5:02:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 06, 2024 5:02:41 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! -Mar 06, 2024 5:02:42 AM reposense.report.ReportGenerator analyzeRepos -INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 06, 2024 1:57:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 06, 2024 1:57:47 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 06, 2024 1:57:47 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... -Mar 06, 2024 5:02:42 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! +Mar 06, 2024 1:57:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! -Mar 06, 2024 5:02:42 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator analyzeRepos INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! -Mar 06, 2024 5:02:42 AM reposense.report.ReportGenerator analyzeRepos -INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... -Mar 06, 2024 5:02:42 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... -Mar 06, 2024 5:02:42 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 06, 2024 5:02:42 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! -Mar 06, 2024 5:02:43 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! -Mar 06, 2024 5:02:43 AM reposense.report.ReportGenerator analyzeRepos -INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 06, 2024 5:02:43 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... -Mar 06, 2024 5:02:43 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 06, 2024 5:02:43 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 06, 2024 1:57:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! +Mar 06, 2024 1:57:48 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... -Mar 06, 2024 5:02:43 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 06, 2024 5:02:43 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! -Mar 06, 2024 5:02:43 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:43 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 06, 2024 5:02:43 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:49 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 06, 2024 1:57:49 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! -Mar 06, 2024 5:02:43 AM reposense.report.ReportGenerator analyzeRepos -INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 06, 2024 5:02:43 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:49 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... -Mar 06, 2024 5:02:43 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:49 PM reposense.report.ReportGenerator analyzeRepos +INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 06, 2024 1:57:49 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... -Mar 06, 2024 5:02:43 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 06, 2024 5:02:43 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:49 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:43 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 06, 2024 1:57:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 06, 2024 1:57:49 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! +Mar 06, 2024 1:57:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 06, 2024 1:57:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 06, 2024 1:57:49 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git completed! -Mar 06, 2024 5:02:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! -Mar 06, 2024 5:02:44 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:49 PM reposense.report.ReportGenerator analyzeRepos INFO: [42/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! -Mar 06, 2024 5:02:44 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:49 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... +Mar 06, 2024 1:57:49 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git to complete... -Mar 06, 2024 5:02:44 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! -Mar 06, 2024 5:02:44 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator analyzeRepos -INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! -Mar 06, 2024 5:02:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:50 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! +Mar 06, 2024 1:57:50 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator analyzeRepos +INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 06, 2024 5:02:44 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! -Mar 06, 2024 5:02:45 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! -Mar 06, 2024 5:02:45 AM reposense.report.ReportGenerator analyzeRepos -INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator analyzeRepos +INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-2/tp.git... -Mar 06, 2024 5:02:45 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:50 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git to complete... -Mar 06, 2024 5:02:45 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! -Mar 06, 2024 5:02:45 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 06, 2024 1:57:50 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator analyzeRepos +INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... -Mar 06, 2024 5:02:45 AM reposense.report.ReportGenerator analyzeRepos -INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... -Mar 06, 2024 5:02:45 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:45 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:45 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! -Mar 06, 2024 5:02:45 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator analyzeRepos +INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... +Mar 06, 2024 1:57:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! -Mar 06, 2024 5:02:45 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 06, 2024 5:02:45 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator analyzeRepos +INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator analyzeRepos +INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... +Mar 06, 2024 1:57:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:51 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 06, 2024 1:57:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 06, 2024 1:57:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! +Mar 06, 2024 1:57:52 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator analyzeRepos +INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 06, 2024 1:57:52 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... +Mar 06, 2024 1:57:52 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... +Mar 06, 2024 1:57:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... -Mar 06, 2024 5:02:46 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... -Mar 06, 2024 5:02:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! +Mar 06, 2024 1:57:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 06, 2024 5:02:46 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! -Mar 06, 2024 5:02:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 06, 2024 5:02:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 06, 2024 5:02:47 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! -Mar 06, 2024 5:02:47 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 06, 2024 1:57:52 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! -Mar 06, 2024 5:02:47 AM reposense.report.ReportGenerator analyzeRepos -INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 06, 2024 5:02:47 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... -Mar 06, 2024 5:02:47 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... -Mar 06, 2024 5:02:47 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator analyzeRepos +INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 06, 2024 1:57:52 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... +Mar 06, 2024 1:57:52 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... +Mar 06, 2024 1:57:52 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 06, 2024 5:02:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 06, 2024 5:02:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 06, 2024 5:02:47 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! -Mar 06, 2024 5:02:47 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! -Mar 06, 2024 5:02:47 AM reposense.report.ReportGenerator analyzeRepos -INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 06, 2024 5:02:47 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... -Mar 06, 2024 5:02:47 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... -Mar 06, 2024 5:02:47 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! -Mar 06, 2024 5:02:48 AM reposense.report.ReportGenerator analyzeRepos -INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepos +INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... -Mar 06, 2024 5:02:48 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... -Mar 06, 2024 5:02:48 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepos +INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:48 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! -Mar 06, 2024 5:02:48 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) completed! -Mar 06, 2024 5:02:48 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! -Mar 06, 2024 5:02:48 AM reposense.report.ReportGenerator analyzeRepos -INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... -Mar 06, 2024 5:02:48 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... -Mar 06, 2024 5:02:48 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepos +INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 06, 2024 1:57:53 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:48 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 06, 2024 5:02:48 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:53 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! -Mar 06, 2024 5:02:49 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! -Mar 06, 2024 5:02:49 AM reposense.report.ReportGenerator analyzeRepos -INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 06, 2024 5:02:49 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... -Mar 06, 2024 5:02:49 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... -Mar 06, 2024 5:02:49 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator analyzeRepos +INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:49 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 06, 2024 5:02:49 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator analyzeRepos +INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... +Mar 06, 2024 1:57:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 06, 2024 5:02:49 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator analyzeRepos +INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 06, 2024 5:02:49 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) completed! -Mar 06, 2024 5:02:49 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! -Mar 06, 2024 5:02:49 AM reposense.report.ReportGenerator analyzeRepos -INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 06, 2024 5:02:49 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... -Mar 06, 2024 5:02:49 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... -Mar 06, 2024 5:02:50 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:50 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! -Mar 06, 2024 5:02:50 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! -Mar 06, 2024 5:02:50 AM reposense.report.ReportGenerator analyzeRepos -INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... -Mar 06, 2024 5:02:50 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... -Mar 06, 2024 5:02:50 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator analyzeRepos +INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... +Mar 06, 2024 1:57:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:50 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 06, 2024 1:57:54 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! +Mar 06, 2024 1:57:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! +Mar 06, 2024 1:57:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! -Mar 06, 2024 5:02:50 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! -Mar 06, 2024 5:02:50 AM reposense.report.ReportGenerator analyzeRepos -INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 06, 2024 5:02:50 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... -Mar 06, 2024 5:02:50 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... -Mar 06, 2024 5:02:50 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:50 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator analyzeRepos -INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:51 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator analyzeRepos INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... -Mar 06, 2024 5:02:51 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:51 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! -Mar 06, 2024 5:02:51 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! -Mar 06, 2024 5:02:51 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator analyzeRepos -INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator analyzeRepos +INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:51 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! -Mar 06, 2024 5:02:51 AM reposense.report.ReportGenerator analyzeRepos -INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator analyzeRepos +INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... -Mar 06, 2024 5:02:51 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... -Mar 06, 2024 5:02:52 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:52 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! -Mar 06, 2024 5:02:52 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:55 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... +Mar 06, 2024 1:57:55 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator analyzeRepos -INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:56 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... -Mar 06, 2024 5:02:52 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:56 PM reposense.report.ReportGenerator analyzeRepos +INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:56 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:52 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! +Mar 06, 2024 1:57:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! +Mar 06, 2024 1:57:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 06, 2024 1:57:56 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! +Mar 06, 2024 1:57:56 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:56 PM reposense.report.ReportGenerator analyzeRepos INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:56 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... -Mar 06, 2024 5:02:52 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:56 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... -Mar 06, 2024 5:02:52 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:56 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:52 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 06, 2024 5:02:52 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! -Mar 06, 2024 5:02:53 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! -Mar 06, 2024 5:02:53 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:57 PM reposense.report.ReportGenerator analyzeRepos INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 06, 2024 1:57:57 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! -Mar 06, 2024 5:02:53 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:53 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... -Mar 06, 2024 5:02:53 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:57 PM reposense.report.ReportGenerator analyzeRepos INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... -Mar 06, 2024 5:02:53 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:57 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 06, 2024 1:57:57 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:53 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... +Mar 06, 2024 1:57:57 PM reposense.report.ReportGenerator analyzeRepos +INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 06, 2024 1:57:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:57 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... +Mar 06, 2024 1:57:58 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! +Mar 06, 2024 1:57:58 PM reposense.report.ReportGenerator analyzeRepos +INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 06, 2024 1:57:58 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... +Mar 06, 2024 1:57:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:58 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! -Mar 06, 2024 5:02:53 AM reposense.report.ReportGenerator analyzeRepos -INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... -Mar 06, 2024 5:02:53 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... -Mar 06, 2024 5:02:54 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:58 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... +Mar 06, 2024 1:57:58 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:57:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 06, 2024 1:57:58 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:54 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 06, 2024 5:02:54 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 06, 2024 5:02:54 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 06, 2024 5:02:54 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:57:58 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! -Mar 06, 2024 5:02:54 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! -Mar 06, 2024 5:02:54 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... -Mar 06, 2024 5:02:54 AM reposense.report.ReportGenerator analyzeRepos -INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 06, 2024 5:02:54 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... -Mar 06, 2024 5:02:54 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:54 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git completed! -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator analyzeRepos INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... -Mar 06, 2024 5:02:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator analyzeRepos -INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-3/tp.git... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator analyzeRepos +INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git to complete... -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:55 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:55 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! -Mar 06, 2024 5:02:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator analyzeRepos -INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:57:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-2/tp.git... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator analyzeRepos +INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git to complete... -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... +Mar 06, 2024 1:57:59 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:55 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:57:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:57:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 06, 2024 1:57:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! -Mar 06, 2024 5:02:55 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:57:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! +Mar 06, 2024 1:57:59 PM reposense.report.ReportGenerator analyzeRepos +INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 06, 2024 1:58:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! -Mar 06, 2024 5:02:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.ReportGenerator analyzeRepos -INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... -Mar 06, 2024 5:02:55 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 06, 2024 1:58:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! -Mar 06, 2024 5:02:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! -Mar 06, 2024 5:02:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! -Mar 06, 2024 5:02:56 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator analyzeRepos -INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-3/tp.git... -Mar 06, 2024 5:02:56 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator analyzeRepos +INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator analyzeRepos INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 06, 2024 5:02:56 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... -Mar 06, 2024 5:02:56 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... -Mar 06, 2024 5:02:56 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator analyzeRepos +INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... +Mar 06, 2024 1:58:00 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:00 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... +Mar 06, 2024 1:58:01 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 06, 2024 1:58:01 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! +Mar 06, 2024 1:58:01 PM reposense.report.ReportGenerator analyzeRepos +INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 06, 2024 1:58:01 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... +Mar 06, 2024 1:58:01 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:01 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... +Mar 06, 2024 1:58:01 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 06, 2024 1:58:01 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 06, 2024 1:58:01 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:01 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! +Mar 06, 2024 1:58:01 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:01 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! -Mar 06, 2024 5:02:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! -Mar 06, 2024 5:02:57 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! -Mar 06, 2024 5:02:57 AM reposense.report.ReportGenerator analyzeRepos -INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... -Mar 06, 2024 5:02:57 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... -Mar 06, 2024 5:02:57 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! -Mar 06, 2024 5:02:57 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.report.ReportGenerator analyzeRepos -INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... -Mar 06, 2024 5:02:57 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... -Mar 06, 2024 5:02:57 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:01 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:01 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 06, 2024 5:02:57 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:01 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:01 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator analyzeRepos -INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator analyzeRepos +INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator analyzeRepos -INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator analyzeRepos +INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... -Mar 06, 2024 5:02:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! -Mar 06, 2024 5:02:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator analyzeRepos -INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator analyzeRepos +INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... -Mar 06, 2024 5:02:58 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 06, 2024 5:02:58 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! -Mar 06, 2024 5:02:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:02 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... +Mar 06, 2024 1:58:02 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... +Mar 06, 2024 1:58:02 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator analyzeRepos +INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 06, 2024 1:58:02 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:02 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 06, 2024 1:58:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:03 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! -Mar 06, 2024 5:02:59 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! -Mar 06, 2024 5:02:59 AM reposense.report.ReportGenerator analyzeRepos -INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... -Mar 06, 2024 5:02:59 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... -Mar 06, 2024 5:02:59 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 06, 2024 1:58:03 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! +Mar 06, 2024 1:58:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 06, 2024 1:58:03 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git completed! -Mar 06, 2024 5:02:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... -Mar 06, 2024 5:02:59 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:58:03 PM reposense.report.ReportGenerator analyzeRepos INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:03 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... +Mar 06, 2024 1:58:03 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git to complete... -Mar 06, 2024 5:02:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:03 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:02:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 06, 2024 5:02:59 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 06, 2024 1:58:03 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! +Mar 06, 2024 1:58:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 06, 2024 1:58:03 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! -Mar 06, 2024 5:03:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator analyzeRepos -INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator analyzeRepos +INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-3/tp.git... -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator analyzeRepos -INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git to complete... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) completed! -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator analyzeRepos +INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator analyzeRepos +INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator analyzeRepos -INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess WARNING: Exception met while trying to clone the repo "AY2324S2-CS2103T-F12-1/tp[master]", will skip this repo. reposense.system.CommandRunnerProcessException: Error returned from command git clone --bare 'https://github.com/AY2324S2-CS2103T-F12-1/tp.git' 'repos/AY2324S2-CS2103T-F12-1_tp/tp_bare' on path . : Cloning into bare repository 'repos/AY2324S2-CS2103T-F12-1_tp/tp_bare'... @@ -1542,175 +1540,177 @@ fatal: could not read Username for 'https://github.com': No such device or addre at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... -Mar 06, 2024 5:03:00 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... -Mar 06, 2024 5:03:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! -Mar 06, 2024 5:03:00 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 06, 2024 1:58:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 06, 2024 5:03:00 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:04 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! -Mar 06, 2024 5:03:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! -Mar 06, 2024 5:03:01 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! -Mar 06, 2024 5:03:01 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator analyzeRepos INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... -Mar 06, 2024 5:03:01 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... -Mar 06, 2024 5:03:01 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:05 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! -Mar 06, 2024 5:03:01 AM reposense.report.ReportGenerator analyzeRepos -INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator analyzeRepos +INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... -Mar 06, 2024 5:03:01 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... -Mar 06, 2024 5:03:01 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 06, 2024 5:03:01 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! -Mar 06, 2024 5:03:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! -Mar 06, 2024 5:03:02 AM reposense.report.RepoCloner spawnCloneProcess +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator analyzeRepos +INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... -Mar 06, 2024 5:03:02 AM reposense.report.ReportGenerator analyzeRepos -INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... -Mar 06, 2024 5:03:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! -Mar 06, 2024 5:03:02 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator analyzeRepos +INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... +Mar 06, 2024 1:58:05 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... +Mar 06, 2024 1:58:05 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 06, 2024 1:58:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! -Mar 06, 2024 5:03:02 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! +Mar 06, 2024 1:58:06 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! -Mar 06, 2024 5:03:02 AM reposense.report.ReportGenerator analyzeRepos -INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... -Mar 06, 2024 5:03:02 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... -Mar 06, 2024 5:03:02 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepos +INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... +Mar 06, 2024 1:58:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 06, 2024 5:03:02 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! -Mar 06, 2024 5:03:03 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:06 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! -Mar 06, 2024 5:03:03 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepos -INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepos -INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepos +INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepos +INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepos +INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. +Mar 06, 2024 1:58:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! -Mar 06, 2024 5:03:03 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepos -INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepos -INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! -Mar 06, 2024 5:03:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! +Mar 06, 2024 1:58:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 06, 2024 5:03:03 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:06 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) completed! -Mar 06, 2024 5:03:04 AM reposense.report.RepoCloner waitForCloneProcess +Mar 06, 2024 1:58:07 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! -Mar 06, 2024 5:03:04 AM reposense.report.ReportGenerator analyzeRepos +Mar 06, 2024 1:58:07 PM reposense.report.ReportGenerator analyzeRepos INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 06, 2024 5:03:04 AM reposense.report.ReportGenerator updateRepoConfig +Mar 06, 2024 1:58:07 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) does not contain a standalone config file. -Mar 06, 2024 5:03:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 06, 2024 1:58:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 06, 2024 5:03:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 06, 2024 1:58:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 06, 2024 5:03:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 06, 2024 1:58:07 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 06, 2024 5:03:04 AM reposense.report.ReportGenerator analyzeRepo +Mar 06, 2024 1:58:07 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) completed! -Mar 06, 2024 5:03:04 AM reposense.report.ReportGenerator generateReposReport +Mar 06, 2024 1:58:07 PM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/tp-dashboard/tp-dashboard/reposense-report -Mar 06, 2024 5:03:04 AM reposense.RepoSense main -INFO: Elapsed processing time: 38.96 second(s) +Mar 06, 2024 1:58:07 PM reposense.RepoSense main +INFO: Elapsed processing time: 35.15 second(s) diff --git a/summary.json b/summary.json index c6447b9b..ef83e05a 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Wed Mar 6 13:02:26 2024 UTC+08:00","reportGenerationTime":" 38.74 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-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":[{"repoName":"AY2324S2-CS2103T-F12-1/tp[master]","errorMessage":"Failed to clone from https://github.com/AY2324S2-CS2103T-F12-1/tp.git"}],"sinceDate":"2024-02-23","untilDate":"2024-03-06","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":"Wed Mar 6 21:57:33 2024 UTC+08:00","reportGenerationTime":" 34.90 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-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":[{"repoName":"AY2324S2-CS2103T-F12-1/tp[master]","errorMessage":"Failed to clone from https://github.com/AY2324S2-CS2103T-F12-1/tp.git"}],"sinceDate":"2024-02-23","untilDate":"2024-03-06","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"}}}