From 9f097e0e9d6f26f475583c9d70305ee33ab89381 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 05:17:46 +0000 Subject: [PATCH] deploy: cbaf7332258d07ca994c67e7587a77b203f02fd0 --- AboutUs.html | 2 +- AboutUs.page-vue-render.js | 2 +- Configuration.html | 2 +- Configuration.page-vue-render.js | 2 +- DevOps.html | 2 +- DevOps.page-vue-render.js | 2 +- DeveloperGuide.html | 97 +++++---- DeveloperGuide.page-vue-render.js | 213 ++++++++++++++++---- Documentation.html | 2 +- Documentation.page-vue-render.js | 2 +- Logging.html | 2 +- Logging.page-vue-render.js | 2 +- SettingUp.html | 2 +- SettingUp.page-vue-render.js | 2 +- Testing.html | 2 +- Testing.page-vue-render.js | 2 +- UserGuide.html | 2 +- UserGuide.page-vue-render.js | 2 +- index.html | 2 +- index.page-vue-render.js | 2 +- siteData.json | 12 +- team/reganchoy.html | 2 +- team/reganchoy.page-vue-render.js | 2 +- team/shuqing.html | 2 +- team/shuqing.page-vue-render.js | 2 +- team/solomonng.html | 2 +- team/solomonng.page-vue-render.js | 2 +- team/yorklim.html | 2 +- team/yorklim.page-vue-render.js | 2 +- tutorials/AddRemark.html | 2 +- tutorials/AddRemark.page-vue-render.js | 2 +- tutorials/RemovingFields.html | 2 +- tutorials/RemovingFields.page-vue-render.js | 2 +- tutorials/TracingCode.html | 2 +- tutorials/TracingCode.page-vue-render.js | 2 +- 35 files changed, 270 insertions(+), 116 deletions(-) diff --git a/AboutUs.html b/AboutUs.html index 96457d2795f..9b68fcf1f7b 100644 --- a/AboutUs.html +++ b/AboutUs.html @@ -23,7 +23,7 @@ [<a href="/tp/team/yorklim.html">portfolio</a>]</p> <ul><li>Role: Team lead + Code quality</li> <li>Responsibilities: Dev Ops</li></ul> <h3 id="ge-shuqing">Ge Shuqing<a href="#ge-shuqing" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <img src="/tp/images/getsquared.png" width="200px"> <p>[<a href="http://github.com/getsquared">github</a>] [<a href="/tp/team/shuqing.html">portfolio</a>]</p> <ul><li><p>Role: Integration + Documentation</p></li> <li><p>Responsibilities: UI</p></li> <li><p>Role: Project Advisor</p></li></ul> <h3 id="regan-choy">Regan Choy<a href="#regan-choy" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <img src="/tp/images/reganchoy.png" width="200px"> <p>[<a href="http://github.com/ReganChoy">github</a>] [<a href="/tp/team/reganchoy.html">portfolio</a>]</p> <ul><li>Role: Deliverables + Deadline + Scheduling</li> <li>Responsibilities: Model</li></ul> <h3 id="solomon-ng">Solomon Ng<a href="#solomon-ng" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <img src="/tp/images/solomonng2001.png" width="200px"> <p>[<a href="http://github.com/solomonng2001">github</a>] -[<a href="/tp/team/solomonng.html">portfolio</a>]</p> <ul><li>Role: Testing</li> <li>Responsibilities: Storage</li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +[<a href="/tp/team/solomonng.html">portfolio</a>]</p> <ul><li>Role: Testing</li> <li>Responsibilities: Storage</li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/AboutUs.page-vue-render.js b/AboutUs.page-vue-render.js index 51257794735..7d64eb222da 100644 --- a/AboutUs.page-vue-render.js +++ b/AboutUs.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"about-us"}},[_v("About Us"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#about-us","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("We are a team based in the "),_c('a',{attrs:{"href":"http://www.comp.nus.edu.sg"}},[_v("School of Computing, National University of Singapore")]),_v(".")]),_v(" "),_c('p',[_v("You can reach us at the email "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("seer[at]comp.nus.edu.sg")])]),_v(" "),_c('h2',{attrs:{"id":"project-team"}},[_v("Project team"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-team","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"chia-york-lim"}},[_v("Chia York Lim"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chia-york-lim","onclick":"event.stopPropagation()"}})]),_v(" "),_c('img',{attrs:{"src":"/tp/images/yorklim.png","width":"200px"}}),_v(" "),_c('p',[_v("["),_c('a',{attrs:{"href":"http://github.com/yorklim"}},[_v("github")]),_v("]\n["),_c('a',{attrs:{"href":"/tp/team/yorklim.html"}},[_v("portfolio")]),_v("]")]),_v(" "),_c('ul',[_c('li',[_v("Role: Team lead + Code quality")]),_v(" "),_c('li',[_v("Responsibilities: Dev Ops")])]),_v(" "),_c('h3',{attrs:{"id":"ge-shuqing"}},[_v("Ge Shuqing"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ge-shuqing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('img',{attrs:{"src":"/tp/images/getsquared.png","width":"200px"}}),_v(" "),_c('p',[_v("["),_c('a',{attrs:{"href":"http://github.com/getsquared"}},[_v("github")]),_v("]\n["),_c('a',{attrs:{"href":"/tp/team/shuqing.html"}},[_v("portfolio")]),_v("]")]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Role: Integration + Documentation")])]),_v(" "),_c('li',[_c('p',[_v("Responsibilities: UI")])]),_v(" "),_c('li',[_c('p',[_v("Role: Project Advisor")])])]),_v(" "),_c('h3',{attrs:{"id":"regan-choy"}},[_v("Regan Choy"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#regan-choy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('img',{attrs:{"src":"/tp/images/reganchoy.png","width":"200px"}}),_v(" "),_c('p',[_v("["),_c('a',{attrs:{"href":"http://github.com/ReganChoy"}},[_v("github")]),_v("]\n["),_c('a',{attrs:{"href":"/tp/team/reganchoy.html"}},[_v("portfolio")]),_v("]")]),_v(" "),_c('ul',[_c('li',[_v("Role: Deliverables + Deadline + Scheduling")]),_v(" "),_c('li',[_v("Responsibilities: Model")])]),_v(" "),_c('h3',{attrs:{"id":"solomon-ng"}},[_v("Solomon Ng"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#solomon-ng","onclick":"event.stopPropagation()"}})]),_v(" "),_c('img',{attrs:{"src":"/tp/images/solomonng2001.png","width":"200px"}}),_v(" "),_c('p',[_v("["),_c('a',{attrs:{"href":"http://github.com/solomonng2001"}},[_v("github")]),_v("]\n["),_c('a',{attrs:{"href":"/tp/team/solomonng.html"}},[_v("portfolio")]),_v("]")]),_v(" "),_c('ul',[_c('li',[_v("Role: Testing")]),_v(" "),_c('li',[_v("Responsibilities: Storage")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/Configuration.html b/Configuration.html index 5ea41e12ee3..a46a6c8777a 100644 --- a/Configuration.html +++ b/Configuration.html @@ -19,7 +19,7 @@ Search </div> <ul class="dropdown-menu search-dropdown-menu d-none dropdown-menu-end" data-v-cea1a814></ul></div></form></li></ul></div></nav> <div class="lower-navbar-container" style="display:none;" data-v-7c0fd418><!----> <!----></div></div></header> <div id="flex-body"><nav id="site-nav" data-v-e6005420><div class="site-nav-top" data-v-e6005420><div class="fw-bold mb-2" style="font-size:1.25rem;" data-v-e6005420>Site Map</div></div> <div class="nav-component slim-scroll" data-v-e6005420><div class="site-nav-root"><ul class="site-nav-list site-nav-list-root" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/index.html" data-v-e6005420>Home</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/UserGuide.html" data-v-e6005420>User Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#quick-start" data-v-e6005420>Quick Start</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#features" data-v-e6005420>Features</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>FAQ</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>Command Summary</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/DeveloperGuide.html" data-v-e6005420>Developer Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#acknowledgements" data-v-e6005420>Acknowledgements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#setting-up-getting-started" data-v-e6005420>Setting Up</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#design" data-v-e6005420>Design</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#implementation" data-v-e6005420>Implementation</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops" data-v-e6005420>Documentation, logging, testing, configuration, dev-ops</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-requirements" data-v-e6005420>Appendix: Requirements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-instructions-for-manual-testing" data-v-e6005420>Appendix: Instructions for manual testing</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420>Tutorials -<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="configuration-guide">Configuration guide<a href="#configuration-guide" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <p>Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: <code class="hljs inline no-lang">config.json</code>).</p></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="configuration-guide">Configuration guide<a href="#configuration-guide" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <p>Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: <code class="hljs inline no-lang">config.json</code>).</p></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/Configuration.page-vue-render.js b/Configuration.page-vue-render.js index 10a3a7c6cce..b5c40caa45e 100644 --- a/Configuration.page-vue-render.js +++ b/Configuration.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"configuration-guide"}},[_v("Configuration guide"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#configuration-guide","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("config.json")]),_v(").")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/DevOps.html b/DevOps.html index 315f5949457..469f2e87730 100644 --- a/DevOps.html +++ b/DevOps.html @@ -21,7 +21,7 @@ <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="devops-guide">DevOps guide<a href="#devops-guide" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <div class="page-nav-print d-none d-print-block"></div> <h2 id="build-automation">Build automation<a href="#build-automation" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This project uses Gradle for <strong>build automation and dependency management</strong>. <strong>You are recommended to read <a href="https://se-education.org/guides/tutorials/gradle.html">this Gradle Tutorial from the se-edu/guides</a></strong>.</p> <p>Given below are how to use Gradle for some important project tasks.</p> <ul><li><p><strong><code class="hljs inline no-lang">clean</code></strong>: Deletes the files created during the previous build tasks (e.g. files in the <code class="hljs inline no-lang">build</code> folder).<br> e.g. <code class="hljs inline no-lang">./gradlew clean</code></p></li> <li><p><strong><code class="hljs inline no-lang">shadowJar</code></strong>: Uses the ShadowJar plugin to creat a fat JAR file in the <code class="hljs inline no-lang">build/lib</code> folder, <em>if the current file is outdated</em>.<br> -e.g. <code class="hljs inline no-lang">./gradlew shadowJar</code>.</p></li> <li><p><strong><code class="hljs inline no-lang">run</code></strong>: Builds and runs the application.<br> <strong><code class="hljs inline no-lang">runShadow</code></strong>: Builds the application as a fat JAR, and then runs it.</p></li> <li><p><strong><code class="hljs inline no-lang">checkstyleMain</code></strong>: Runs the code style check for the main code base.<br> <strong><code class="hljs inline no-lang">checkstyleTest</code></strong>: Runs the code style check for the test code base.</p></li> <li><p><strong><code class="hljs inline no-lang">test</code></strong>: Runs all tests.</p> <ul><li><code class="hljs inline no-lang">./gradlew test</code> — Runs all tests</li> <li><code class="hljs inline no-lang">./gradlew clean test</code> — Cleans the project and runs tests</li></ul></li></ul> <hr> <h2 id="continuous-integration-ci">Continuous integration (CI)<a href="#continuous-integration-ci" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the <code class="hljs inline no-lang">.github/workflows</code> folder). No further setting up required.</p> <h3 id="code-coverage">Code coverage<a href="#code-coverage" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>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.</p> <p>To enable Codecov for forks of this project, follow the steps given in <a href="https://se-education.org/guides/tutorials/codecov.html">this se-edu guide</a>.</p> <h3 id="repository-wide-checks">Repository-wide checks<a href="#repository-wide-checks" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>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:</p> <p><code class="hljs inline no-lang">./config/travis/run-checks.sh</code></p> <p>Any warnings or errors will be printed out to the console.</p> <p><strong>If adding new checks:</strong></p> <ul><li><p>Checks are implemented as executable <code class="hljs inline no-lang">check-*</code> scripts within the <code class="hljs inline no-lang">.github</code> directory. The <code class="hljs inline no-lang">run-checks.sh</code> 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.</p></li> <li><p>Check scripts should print out errors in the format <code class="hljs inline no-lang">SEVERITY:FILENAME:LINE: MESSAGE</code></p> <ul><li>SEVERITY is either ERROR or WARN.</li> <li>FILENAME is the path to the file relative to the current directory.</li> <li>LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.</li></ul></li> <li><p>Check scripts must exit with a non-zero exit code if any errors occur.</p></li></ul> <hr> <h2 id="making-a-release">Making a release<a href="#making-a-release" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>Here are the steps to create a new release.</p> <ol><li>Update the version number in <a href="https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java"><code class="hljs inline no-lang">MainApp.java</code></a>.</li> <li>Generate a fat JAR file using Gradle (i.e., <code class="hljs inline no-lang">gradlew shadowJar</code>).</li> <li>Tag the repo with the version number. e.g. <code class="hljs inline no-lang">v0.1</code></li> <li><a href="https://help.github.com/articles/creating-releases/">Create a new release using GitHub</a>. Upload the JAR file you created.</li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#devops-guide" data-v-e6005420>DevOps guide</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#build-automation" data-v-e6005420>Build automation</a> <a class="nav-link py-1" href="#continuous-integration-ci" data-v-e6005420>Continuous integration (CI)</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#code-coverage" data-v-e6005420>Code coverage</a> <a class="nav-link py-1" href="#repository-wide-checks" data-v-e6005420>Repository-wide checks</a></nav> <a class="nav-link py-1" href="#making-a-release" data-v-e6005420>Making a release</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +e.g. <code class="hljs inline no-lang">./gradlew shadowJar</code>.</p></li> <li><p><strong><code class="hljs inline no-lang">run</code></strong>: Builds and runs the application.<br> <strong><code class="hljs inline no-lang">runShadow</code></strong>: Builds the application as a fat JAR, and then runs it.</p></li> <li><p><strong><code class="hljs inline no-lang">checkstyleMain</code></strong>: Runs the code style check for the main code base.<br> <strong><code class="hljs inline no-lang">checkstyleTest</code></strong>: Runs the code style check for the test code base.</p></li> <li><p><strong><code class="hljs inline no-lang">test</code></strong>: Runs all tests.</p> <ul><li><code class="hljs inline no-lang">./gradlew test</code> — Runs all tests</li> <li><code class="hljs inline no-lang">./gradlew clean test</code> — Cleans the project and runs tests</li></ul></li></ul> <hr> <h2 id="continuous-integration-ci">Continuous integration (CI)<a href="#continuous-integration-ci" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the <code class="hljs inline no-lang">.github/workflows</code> folder). No further setting up required.</p> <h3 id="code-coverage">Code coverage<a href="#code-coverage" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>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.</p> <p>To enable Codecov for forks of this project, follow the steps given in <a href="https://se-education.org/guides/tutorials/codecov.html">this se-edu guide</a>.</p> <h3 id="repository-wide-checks">Repository-wide checks<a href="#repository-wide-checks" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>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:</p> <p><code class="hljs inline no-lang">./config/travis/run-checks.sh</code></p> <p>Any warnings or errors will be printed out to the console.</p> <p><strong>If adding new checks:</strong></p> <ul><li><p>Checks are implemented as executable <code class="hljs inline no-lang">check-*</code> scripts within the <code class="hljs inline no-lang">.github</code> directory. The <code class="hljs inline no-lang">run-checks.sh</code> 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.</p></li> <li><p>Check scripts should print out errors in the format <code class="hljs inline no-lang">SEVERITY:FILENAME:LINE: MESSAGE</code></p> <ul><li>SEVERITY is either ERROR or WARN.</li> <li>FILENAME is the path to the file relative to the current directory.</li> <li>LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.</li></ul></li> <li><p>Check scripts must exit with a non-zero exit code if any errors occur.</p></li></ul> <hr> <h2 id="making-a-release">Making a release<a href="#making-a-release" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>Here are the steps to create a new release.</p> <ol><li>Update the version number in <a href="https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java"><code class="hljs inline no-lang">MainApp.java</code></a>.</li> <li>Generate a fat JAR file using Gradle (i.e., <code class="hljs inline no-lang">gradlew shadowJar</code>).</li> <li>Tag the repo with the version number. e.g. <code class="hljs inline no-lang">v0.1</code></li> <li><a href="https://help.github.com/articles/creating-releases/">Create a new release using GitHub</a>. Upload the JAR file you created.</li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#devops-guide" data-v-e6005420>DevOps guide</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#build-automation" data-v-e6005420>Build automation</a> <a class="nav-link py-1" href="#continuous-integration-ci" data-v-e6005420>Continuous integration (CI)</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#code-coverage" data-v-e6005420>Code coverage</a> <a class="nav-link py-1" href="#repository-wide-checks" data-v-e6005420>Repository-wide checks</a></nav> <a class="nav-link py-1" href="#making-a-release" data-v-e6005420>Making a release</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/DevOps.page-vue-render.js b/DevOps.page-vue-render.js index 9d178dd4696..43e39e7b516 100644 --- a/DevOps.page-vue-render.js +++ b/DevOps.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"devops-guide"}},[_v("DevOps guide"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#devops-guide","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{pre:true,attrs:{"class":"page-nav-print d-none d-print-block"}}),_v(" "),_c('h2',{attrs:{"id":"build-automation"}},[_v("Build automation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#build-automation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This project uses Gradle for "),_c('strong',[_v("build automation and dependency management")]),_v(". "),_c('strong',[_v("You are recommended to read "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/gradle.html"}},[_v("this Gradle Tutorial from the se-edu/guides")])]),_v(".")]),_v(" "),_c('p',[_v("Given below are how to use Gradle for some important project tasks.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clean")])]),_v(": Deletes the files created during the previous build tasks (e.g. files in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("build")]),_v(" folder)."),_c('br'),_v("\ne.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("./gradlew clean")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("shadowJar")])]),_v(": Uses the ShadowJar plugin to creat a fat JAR file in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("build/lib")]),_v(" folder, "),_c('em',[_v("if the current file is outdated")]),_v("."),_c('br'),_v("\ne.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("./gradlew shadowJar")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("run")])]),_v(": Builds and runs the application."),_c('br'),_v(" "),_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("runShadow")])]),_v(": Builds the application as a fat JAR, and then runs it.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("checkstyleMain")])]),_v(": Runs the code style check for the main code base."),_c('br'),_v(" "),_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("checkstyleTest")])]),_v(": Runs the code style check for the test code base.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("test")])]),_v(": Runs all tests.")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("./gradlew test")]),_v(" — Runs all tests")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("./gradlew clean test")]),_v(" — Cleans the project and runs tests")])])])]),_v(" "),_c('hr'),_v(" "),_c('h2',{attrs:{"id":"continuous-integration-ci"}},[_v("Continuous integration (CI)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#continuous-integration-ci","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".github/workflows")]),_v(" folder). No further setting up required.")]),_v(" "),_c('h3',{attrs:{"id":"code-coverage"}},[_v("Code coverage"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#code-coverage","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("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.")]),_v(" "),_c('p',[_v("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.")]),_v(" "),_c('p',[_v("To enable Codecov for forks of this project, follow the steps given in "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/codecov.html"}},[_v("this se-edu guide")]),_v(".")]),_v(" "),_c('h3',{attrs:{"id":"repository-wide-checks"}},[_v("Repository-wide checks"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#repository-wide-checks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("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.")]),_v(" "),_c('p',[_v("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:")]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("./config/travis/run-checks.sh")])]),_v(" "),_c('p',[_v("Any warnings or errors will be printed out to the console.")]),_v(" "),_c('p',[_c('strong',[_v("If adding new checks:")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Checks are implemented as executable "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("check-*")]),_v(" scripts within the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".github")]),_v(" directory. The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("run-checks.sh")]),_v(" 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.")])]),_v(" "),_c('li',[_c('p',[_v("Check scripts should print out errors in the format "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("SEVERITY:FILENAME:LINE: MESSAGE")])]),_v(" "),_c('ul',[_c('li',[_v("SEVERITY is either ERROR or WARN.")]),_v(" "),_c('li',[_v("FILENAME is the path to the file relative to the current directory.")]),_v(" "),_c('li',[_v("LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.")])])]),_v(" "),_c('li',[_c('p',[_v("Check scripts must exit with a non-zero exit code if any errors occur.")])])]),_v(" "),_c('hr'),_v(" "),_c('h2',{attrs:{"id":"making-a-release"}},[_v("Making a release"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#making-a-release","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Here are the steps to create a new release.")]),_v(" "),_c('ol',[_c('li',[_v("Update the version number in "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("MainApp.java")])]),_v(".")]),_v(" "),_c('li',[_v("Generate a fat JAR file using Gradle (i.e., "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("gradlew shadowJar")]),_v(").")]),_v(" "),_c('li',[_v("Tag the repo with the version number. e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v0.1")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://help.github.com/articles/creating-releases/"}},[_v("Create a new release using GitHub")]),_v(". Upload the JAR file you created.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/DeveloperGuide.html b/DeveloperGuide.html index 6497e4a4503..9d53d862034 100644 --- a/DeveloperGuide.html +++ b/DeveloperGuide.html @@ -20,23 +20,10 @@ </div> <ul class="dropdown-menu search-dropdown-menu d-none dropdown-menu-end" data-v-cea1a814></ul></div></form></li></ul></div></nav> <div class="lower-navbar-container" style="display:none;" data-v-7c0fd418><!----> <!----></div></div></header> <div id="flex-body"><nav id="site-nav" data-v-e6005420><div class="site-nav-top" data-v-e6005420><div class="fw-bold mb-2" style="font-size:1.25rem;" data-v-e6005420>Site Map</div></div> <div class="nav-component slim-scroll" data-v-e6005420><div class="site-nav-root"><ul class="site-nav-list site-nav-list-root" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/index.html" data-v-e6005420>Home</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/UserGuide.html" data-v-e6005420>User Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#quick-start" data-v-e6005420>Quick Start</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#features" data-v-e6005420>Features</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>FAQ</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>Command Summary</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/DeveloperGuide.html" data-v-e6005420>Developer Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#acknowledgements" data-v-e6005420>Acknowledgements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#setting-up-getting-started" data-v-e6005420>Setting Up</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#design" data-v-e6005420>Design</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#implementation" data-v-e6005420>Implementation</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops" data-v-e6005420>Documentation, logging, testing, configuration, dev-ops</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-requirements" data-v-e6005420>Appendix: Requirements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-instructions-for-manual-testing" data-v-e6005420>Appendix: Instructions for manual testing</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420>Tutorials <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="clientcare">ClientCare<a href="#clientcare" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <div class="page-nav-print d-none d-print-block"></div> <hr> <h2 id="acknowledgements"><strong>Acknowledgements</strong><a href="#acknowledgements" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p><em>{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }</em></p> <hr> <h2 id="setting-up-getting-started"><strong>Setting up, getting started</strong><a href="#setting-up-getting-started" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>Refer to the guide <a href="/tp/SettingUp.html"><em>Setting up and getting started</em></a>.</p> <hr> <h2 id="design"><strong>Design</strong><a href="#design" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <h3 id="architecture">Architecture<a href="#architecture" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <span class="image-wrapper"><img src="/tp/diagrams/ArchitectureDiagram.png" width="280" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The <em><strong>Architecture Diagram</strong></em> given above explains the high-level design of the App.</p> <p>Given below is a quick overview of main components and how they interact with each other.</p> <p><strong>Main components of the architecture</strong></p> <p><strong><code class="hljs inline no-lang">Main</code></strong> (consisting of classes <a href="https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java"><code class="hljs inline no-lang">Main</code></a> and <a href="https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java"><code class="hljs inline no-lang">MainApp</code></a>) is in charge of the app launch and shut down.</p> <ul><li>At app launch, it initializes the other components in the correct sequence, and connects them up with each other.</li> <li>At shut down, it shuts down the other components and invokes cleanup methods where necessary.</li></ul> <p>The bulk of the app's work is done by the following four components:</p> <ul><li><a href="#ui-component"><strong><code class="hljs inline no-lang">UI</code></strong></a>: The UI of the App.</li> <li><a href="#logic-component"><strong><code class="hljs inline no-lang">Logic</code></strong></a>: The command executor.</li> <li><a href="#model-component"><strong><code class="hljs inline no-lang">Model</code></strong></a>: Holds the data of the App in memory.</li> <li><a href="#storage-component"><strong><code class="hljs inline no-lang">Storage</code></strong></a>: Reads data from, and writes data to, the hard disk.</li></ul> <p><a href="#common-classes"><strong><code class="hljs inline no-lang">Commons</code></strong></a> represents a collection of classes used by multiple other components.</p> <p><strong>How the architecture components interact with each other</strong></p> <p>The <em>Sequence Diagram</em> below shows how the components interact with each other for the scenario where the user issues the command <code class="hljs inline no-lang">delete 1</code>.</p> <span class="image-wrapper"><img src="/tp/diagrams/ArchitectureSequenceDiagram.png" width="574" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>Each of the four main components (also shown in the diagram above),</p> <ul><li>defines its <em>API</em> in an <code class="hljs inline no-lang">interface</code> with the same name as the Component.</li> <li>implements its functionality using a concrete <code class="hljs inline no-lang">{Component Name}Manager</code> class (which follows the corresponding API <code class="hljs inline no-lang">interface</code> mentioned in the previous point.</li></ul> <p>For example, the <code class="hljs inline no-lang">Logic</code> component defines its API in the <code class="hljs inline no-lang">Logic.java</code> interface and implements its functionality using the <code class="hljs inline no-lang">LogicManager.java</code> class which follows the <code class="hljs inline no-lang">Logic</code> interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component's being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.</p> <span class="image-wrapper"><img src="/tp/diagrams/ComponentManagers.png" width="300" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The sections below give more details of each component.</p> <h3 id="ui-component">UI component<a href="#ui-component" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The <strong>API</strong> of this component is specified in <a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/blob/master/src/main/java/seedu/address/ui/Ui.java"><code class="hljs inline no-lang">Ui.java</code></a></p> <span class="image-wrapper"><img src="/tp/diagrams/UiClassDiagram.png" alt="Structure of the UI Component" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The UI consists of a <code class="hljs inline no-lang">MainWindow</code> that is made up of parts e.g.<code class="hljs inline no-lang">CommandBox</code>, <code class="hljs inline no-lang">ResultDisplay</code>, <code class="hljs inline no-lang">PersonListPanel</code>, <code class="hljs inline no-lang">StatusBarFooter</code> etc. All these, including the <code class="hljs inline no-lang">MainWindow</code>, inherit from the abstract <code class="hljs inline no-lang">UiPart</code> class which captures the commonalities between classes that represent parts of the visible GUI.</p> <p>The <code class="hljs inline no-lang">UI</code> component uses the JavaFx UI framework. The layout of these UI parts are defined in matching <code class="hljs inline no-lang">.fxml</code> files that are in the <code class="hljs inline no-lang">src/main/resources/view</code> folder. For example, the layout of the <a href="https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java"><code class="hljs inline no-lang">MainWindow</code></a> is specified in <a href="https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml"><code class="hljs inline no-lang">MainWindow.fxml</code></a></p> <p>The <code class="hljs inline no-lang">UI</code> component,</p> <ul><li>executes user commands using the <code class="hljs inline no-lang">Logic</code> component.</li> <li>listens for changes to <code class="hljs inline no-lang">Model</code> data so that the UI can be updated with the modified data.</li> <li>keeps a reference to the <code class="hljs inline no-lang">Logic</code> component, because the <code class="hljs inline no-lang">UI</code> relies on the <code class="hljs inline no-lang">Logic</code> to execute commands.</li> <li>depends on some classes in the <code class="hljs inline no-lang">Model</code> component, as it displays <code class="hljs inline no-lang">Person</code> object residing in the <code class="hljs inline no-lang">Model</code>.</li></ul> <h3 id="logic-component">Logic component<a href="#logic-component" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><strong>API</strong> : <a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/blob/master/src/main/java/seedu/address/logic/Logic.java"><code class="hljs inline no-lang">Logic.java</code></a></p> <p>Here's a (partial) class diagram of the <code class="hljs inline no-lang">Logic</code> component:</p> <span class="image-wrapper"><img src="/tp/diagrams/LogicClassDiagram.png" width="550" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The sequence diagram below illustrates the interactions within the <code class="hljs inline no-lang">Logic</code> component, taking <code class="hljs inline no-lang">execute("delete 1")</code> API call as an example.</p> <span class="image-wrapper"><img src="/tp/diagrams/DeleteSequenceDiagram.png" alt="Interactions Inside the Logic Component for the `delete 1` Command" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> The lifeline for <code class="hljs inline no-lang" data-v-0eabf1c4>DeleteCommandParser</code> should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.</p></div> <!----></div></div></div> <p>How the <code class="hljs inline no-lang">Logic</code> component works:</p> <ol><li>When <code class="hljs inline no-lang">Logic</code> is called upon to execute a command, it is passed to an <code class="hljs inline no-lang">AddressBookParser</code> object which in turn creates a parser that matches the command (e.g., <code class="hljs inline no-lang">DeleteCommandParser</code>) and uses it to parse the command.</li> <li>This results in a <code class="hljs inline no-lang">Command</code> object (more precisely, an object of one of its subclasses e.g., <code class="hljs inline no-lang">DeleteCommand</code>) which is executed by the <code class="hljs inline no-lang">LogicManager</code>.</li> <li>The command can communicate with the <code class="hljs inline no-lang">Model</code> when it is executed (e.g. to delete a person).<br> -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 <code class="hljs inline no-lang">Model</code>) to achieve.</li> <li>The result of the command execution is encapsulated as a <code class="hljs inline no-lang">CommandResult</code> object which is returned back from <code class="hljs inline no-lang">Logic</code>.</li></ol> <p>Here are the other classes in <code class="hljs inline no-lang">Logic</code> (omitted from the class diagram above) that are used for parsing a user command:</p> <span class="image-wrapper"><img src="/tp/diagrams/ParserClasses.png" width="600" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>How the parsing works:</p> <ul><li>When called upon to parse a user command, the <code class="hljs inline no-lang">AddressBookParser</code> class creates an <code class="hljs inline no-lang">XYZCommandParser</code> (<code class="hljs inline no-lang">XYZ</code> is a placeholder for the specific command name e.g., <code class="hljs inline no-lang">AddCommandParser</code>) which uses the other classes shown above to parse the user command and create a <code class="hljs inline no-lang">XYZCommand</code> object (e.g., <code class="hljs inline no-lang">AddCommand</code>) which the <code class="hljs inline no-lang">AddressBookParser</code> returns back as a <code class="hljs inline no-lang">Command</code> object.</li> <li>All <code class="hljs inline no-lang">XYZCommandParser</code> classes (e.g., <code class="hljs inline no-lang">AddCommandParser</code>, <code class="hljs inline no-lang">DeleteCommandParser</code>, ...) inherit from the <code class="hljs inline no-lang">Parser</code> interface so that they can be treated similarly where possible e.g, during testing.</li></ul> <h3 id="model-component">Model component<a href="#model-component" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><strong>API</strong> : <a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/blob/master/src/main/java/seedu/address/model/Model.java"><code class="hljs inline no-lang">Model.java</code></a></p> <span class="image-wrapper"><img src="/tp/diagrams/ModelClassDiagram.png" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The <code class="hljs inline no-lang">Model</code> component,</p> <ul><li>stores the address book data i.e., all <code class="hljs inline no-lang">Person</code> objects (which are contained in a <code class="hljs inline no-lang">UniquePersonList</code> object).</li> <li>stores the currently 'selected' <code class="hljs inline no-lang">Person</code> objects (e.g., results of a search query) as a separate <em>filtered</em> list which is exposed to outsiders as an unmodifiable <code class="hljs inline no-lang">ObservableList<Person></code> that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.</li> <li>stores a <code class="hljs inline no-lang">UserPref</code> object that represents the user’s preferences. This is exposed to the outside as a <code class="hljs inline no-lang">ReadOnlyUserPref</code> objects.</li> <li>does not depend on any of the other three components (as the <code class="hljs inline no-lang">Model</code> represents data entities of the domain, they should make sense on their own without depending on other components)</li></ul> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> An alternative (arguably, a more OOP) model is given below. It has a <code class="hljs inline no-lang" data-v-0eabf1c4>Tag</code> list in the <code class="hljs inline no-lang" data-v-0eabf1c4>AddressBook</code>, which <code class="hljs inline no-lang" data-v-0eabf1c4>Person</code> references. This allows <code class="hljs inline no-lang" data-v-0eabf1c4>AddressBook</code> to only require one <code class="hljs inline no-lang" data-v-0eabf1c4>Tag</code> object per unique tag, instead of each <code class="hljs inline no-lang" data-v-0eabf1c4>Person</code> needing their own <code class="hljs inline no-lang" data-v-0eabf1c4>Tag</code> objects.<br data-v-0eabf1c4></p> <span class="image-wrapper"><img src="/tp/diagrams/BetterModelClassDiagram.png" width="450" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span></div> <!----></div></div></div> <h3 id="storage-component">Storage component<a href="#storage-component" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><strong>API</strong> : <a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/blob/master/src/main/java/seedu/address/storage/Storage.java"><code class="hljs inline no-lang">Storage.java</code></a></p> <span class="image-wrapper"><img src="/tp/diagrams/StorageClassDiagram.png" width="550" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The <code class="hljs inline no-lang">Storage</code> component,</p> <ul><li>can save both address book data and user preference data in JSON format, and read them back into corresponding objects.</li> <li>inherits from both <code class="hljs inline no-lang">AddressBookStorage</code> and <code class="hljs inline no-lang">UserPrefStorage</code>, which means it can be treated as either one (if only the functionality of only one is needed).</li> <li>depends on some classes in the <code class="hljs inline no-lang">Model</code> component (because the <code class="hljs inline no-lang">Storage</code> component's job is to save/retrieve objects that belong to the <code class="hljs inline no-lang">Model</code>)</li></ul> <h3 id="common-classes">Common classes<a href="#common-classes" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>Classes used by multiple components are in the <code class="hljs inline no-lang">seedu.addressbook.commons</code> package.</p> <hr> <h2 id="implementation"><strong>Implementation</strong><a href="#implementation" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This section describes some noteworthy details on how certain features are implemented.</p> <h3 id="updating-last-met-feature">Updating last met feature<a href="#updating-last-met-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The last met feature allows users to keep track and update their last interaction with their clients.</p> <h4 id="implementation-2">Implementation<a href="#implementation-2" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The updating of last met command is facilitated by the <code class="hljs inline no-lang">LastMetCommandParser</code> class which is created by the <code class="hljs inline no-lang">AddressBookParser</code>.</p> <p>The <code class="hljs inline no-lang">LastMetCommandParser#parse()</code> overrides <code class="hljs inline no-lang">Parser#parse()</code> in the <code class="hljs inline no-lang">Parser</code> interface.</p> <ul><li><code class="hljs inline no-lang">LastMetCommandParser#parse()</code> - Parses the input arguments by storing the prefixes of it respective values in a <code class="hljs inline no-lang">ArgumentMultimap</code> object.</li> <li>It will then convert the String input into a Date object before creating a new <code class="hljs inline no-lang">LastMetCommand</code> object with the formatted date.</li></ul> <p>The <code class="hljs inline no-lang">LastMetCommand</code> object is then executed by the <code class="hljs inline no-lang">Logic</code> component.</p> <p>The <code class="hljs inline no-lang">LastMetCommand</code> object then communicates with the <code class="hljs inline no-lang">Model</code> component to update the LastMet to the client. The <code class="hljs inline no-lang">Model</code> component then updates the <code class="hljs inline no-lang">Person</code> object with the new LastMet.</p> <ul><li><code class="hljs inline no-lang">Model#setPerson(Person, Person)</code> - Sets the client in the existing client list to the new <code class="hljs inline no-lang">Person</code> object which has been edited by the <code class="hljs inline no-lang">LastMetCommand#execute()</code> which contains the new LastMet.</li> <li><code class="hljs inline no-lang">Model#setDisplayClient(Person)</code> - Updates the displayed client in the UI to the client that has been edited with the new LastMet.</li></ul> <p>The method <code class="hljs inline no-lang">LastMetCommand#execute()</code> returns a CommandResult object which contains the success message to be displayed to the user.</p> <p>The following object diagram illustrates the above:</p> <span class="image-wrapper"><img src="/tp/diagrams/LastMetObjectDiagram.png" width="600" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The following sequence diagram shows the lastmet operation:</p> <span class="image-wrapper"><img src="/tp/diagrams/LastMetSequenceDiagram.png" width="900" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <h3 id="add-policy-feature">Add policy feature<a href="#add-policy-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The add policy feature allows users to add a policy to a client. The policy is stored in the <code class="hljs inline no-lang">Policy</code> class, which contains the policy details such as policy name, policy id. The <code class="hljs inline no-lang">Policy</code> class is then added to the <code class="hljs inline no-lang">PolicyList</code> object stored within the <code class="hljs inline no-lang">Person</code> object in the <code class="hljs inline no-lang">Model</code> component.</p> <h4 id="implementation-3">Implementation<a href="#implementation-3" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The add policy command mechanism is facilitated by the <code class="hljs inline no-lang">AddPolicyCommandParser</code> class which is created by the <code class="hljs inline no-lang">AddressBookParser</code>.</p> <p>The <code class="hljs inline no-lang">AddPolicyCommandParser</code> class is responsible for parsing the user input and creating an <code class="hljs inline no-lang">AddPolicyCommand</code> object.</p> <p>The <code class="hljs inline no-lang">AddPolicyCommandParser#parse()</code> overrides <code class="hljs inline no-lang">Parser#parse()</code> in the <code class="hljs inline no-lang">Parser</code> interface.</p> <ul><li><code class="hljs inline no-lang">AddPolicyCommandParser#parse()</code> - Parses the input arguments by storing the prefixes of it respective values in a <code class="hljs inline no-lang">ArgumentMultimap</code> object, and creates a new <code class="hljs inline no-lang">AddPolicyCommand</code> object with the parsed policy name and policy ID.</li></ul> <p>The <code class="hljs inline no-lang">AddPolicyCommand</code> object is then executed by the <code class="hljs inline no-lang">Logic</code> component.</p> <p>The <code class="hljs inline no-lang">AddPolicyCommand</code> object then communicates with the <code class="hljs inline no-lang">Model</code> component to add the policy to the client. The <code class="hljs inline no-lang">Model</code> component then updates the <code class="hljs inline no-lang">Person</code> object with the new policy.</p> <ul><li><code class="hljs inline no-lang">Model#setPerson(Person, Person)</code> - Sets the client in the existing client list to the new <code class="hljs inline no-lang">Person</code> object which has been edited by the <code class="hljs inline no-lang">AddPolicyCommand#execute()</code> which contains the new policy.</li> <li><code class="hljs inline no-lang">Model#setDisplayClient(Person)</code> - Updates the displayed client in the UI to the client that has been edited with the new policy.</li></ul> <p>The method <code class="hljs inline no-lang">AddPolicyCommand#execute()</code> returns a CommandResult object which contains the success message to be displayed to the user.</p> <p>The following object diagram illustrates the above:</p> <span class="image-wrapper"><img src="/tp/diagrams/AddPolicyObjectDiagram.png" width="600" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The following sequence diagram shows the addpolicy operation:</p> <span class="image-wrapper"><img src="/tp/diagrams/AddPolicySequenceDiagram.png" width="900" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <h3 id="view-client-feature">View Client feature<a href="#view-client-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The view client feature allows users to view the details of a client using their <code class="hljs inline no-lang">INDEX</code> on the GUI. This includes information not included in the client list cards, such as their last met and policy list.</p> <h4 id="implementation-4">Implementation<a href="#implementation-4" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The view client mechanism is facilitated by <code class="hljs inline no-lang">DisplayClient</code> in the model. When any command referring to a client using <code class="hljs inline no-lang">INDEX</code> is executed, this DisplayClient is set to the client that was operated on (or cleared to <code class="hljs inline no-lang">null</code> in the case of <code class="hljs inline no-lang">delete</code> and <code class="hljs inline no-lang">clear</code>). -This is done with the <code class="hljs inline no-lang">setDisplayClient()</code> function in the <code class="hljs inline no-lang">Model</code>, that is also implemented in <code class="hljs inline no-lang">Logic</code>.</p> <p>The sequence diagram below shows the execution of <code class="hljs inline no-lang">view 1</code> to view the details of client at index 1.</p> <span class="image-wrapper"><img src="/tp/diagrams/ViewClientSequenceDiagram.png" width="900" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p><code class="hljs inline no-lang">MainWindow</code> handles most of the UI logic in regard to displaying the viewed client on the GUI, including refreshing the <code class="hljs inline no-lang">ClientDetailsPanel</code> and <code class="hljs inline no-lang">ClientPolicyTable</code>. It also sets <code class="hljs inline no-lang">DisplayClient</code> on startup when there is at least one client in the list.</p> <h3 id="proposed-undo-redo-feature">[Proposed] Undo/redo feature<a href="#proposed-undo-redo-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h4 id="proposed-implementation">Proposed Implementation<a href="#proposed-implementation" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The proposed undo/redo mechanism is facilitated by <code class="hljs inline no-lang">VersionedAddressBook</code>. It extends <code class="hljs inline no-lang">AddressBook</code> with an undo/redo history, stored internally as an <code class="hljs inline no-lang">addressBookStateList</code> and <code class="hljs inline no-lang">currentStatePointer</code>. Additionally, it implements the following operations:</p> <ul><li><code class="hljs inline no-lang">VersionedAddressBook#commit()</code> — Saves the current address book state in its history.</li> <li><code class="hljs inline no-lang">VersionedAddressBook#undo()</code> — Restores the previous address book state from its history.</li> <li><code class="hljs inline no-lang">VersionedAddressBook#redo()</code> — Restores a previously undone address book state from its history.</li></ul> <p>These operations are exposed in the <code class="hljs inline no-lang">Model</code> interface as <code class="hljs inline no-lang">Model#commitAddressBook()</code>, <code class="hljs inline no-lang">Model#undoAddressBook()</code> and <code class="hljs inline no-lang">Model#redoAddressBook()</code> respectively.</p> <p>Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.</p> <p>Step 1. The user launches the application for the first time. The <code class="hljs inline no-lang">VersionedAddressBook</code> will be initialized with the initial address book state, and the <code class="hljs inline no-lang">currentStatePointer</code> pointing to that single address book state.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState0.png" alt="UndoRedoState0" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>Step 2. The user executes <code class="hljs inline no-lang">delete 5</code> command to delete the 5th person in the address book. The <code class="hljs inline no-lang">delete</code> command calls <code class="hljs inline no-lang">Model#commitAddressBook()</code>, causing the modified state of the address book after the <code class="hljs inline no-lang">delete 5</code> command executes to be saved in the <code class="hljs inline no-lang">addressBookStateList</code>, and the <code class="hljs inline no-lang">currentStatePointer</code> is shifted to the newly inserted address book state.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState1.png" alt="UndoRedoState1" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>Step 3. The user executes <code class="hljs inline no-lang">add n/David …</code> to add a new person. The <code class="hljs inline no-lang">add</code> command also calls <code class="hljs inline no-lang">Model#commitAddressBook()</code>, causing another modified address book state to be saved into the <code class="hljs inline no-lang">addressBookStateList</code>.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState2.png" alt="UndoRedoState2" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> If a command fails its execution, it will not call <code class="hljs inline no-lang" data-v-0eabf1c4>Model#commitAddressBook()</code>, so the address book state will not be saved into the <code class="hljs inline no-lang" data-v-0eabf1c4>addressBookStateList</code>.</p></div> <!----></div></div></div> <p>Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the <code class="hljs inline no-lang">undo</code> command. The <code class="hljs inline no-lang">undo</code> command will call <code class="hljs inline no-lang">Model#undoAddressBook()</code>, which will shift the <code class="hljs inline no-lang">currentStatePointer</code> once to the left, pointing it to the previous address book state, and restores the address book to that state.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState3.png" alt="UndoRedoState3" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> If the <code class="hljs inline no-lang" data-v-0eabf1c4>currentStatePointer</code> is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The <code class="hljs inline no-lang" data-v-0eabf1c4>undo</code> command uses <code class="hljs inline no-lang" data-v-0eabf1c4>Model#canUndoAddressBook()</code> to check if this is the case. If so, it will return an error to the user rather +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 <code class="hljs inline no-lang">Model</code>) to achieve.</li> <li>The result of the command execution is encapsulated as a <code class="hljs inline no-lang">CommandResult</code> object which is returned back from <code class="hljs inline no-lang">Logic</code>.</li></ol> <p>Here are the other classes in <code class="hljs inline no-lang">Logic</code> (omitted from the class diagram above) that are used for parsing a user command:</p> <span class="image-wrapper"><img src="/tp/diagrams/ParserClasses.png" width="600" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>How the parsing works:</p> <ul><li>When called upon to parse a user command, the <code class="hljs inline no-lang">AddressBookParser</code> class creates an <code class="hljs inline no-lang">XYZCommandParser</code> (<code class="hljs inline no-lang">XYZ</code> is a placeholder for the specific command name e.g., <code class="hljs inline no-lang">AddCommandParser</code>) which uses the other classes shown above to parse the user command and create a <code class="hljs inline no-lang">XYZCommand</code> object (e.g., <code class="hljs inline no-lang">AddCommand</code>) which the <code class="hljs inline no-lang">AddressBookParser</code> returns back as a <code class="hljs inline no-lang">Command</code> object.</li> <li>All <code class="hljs inline no-lang">XYZCommandParser</code> classes (e.g., <code class="hljs inline no-lang">AddCommandParser</code>, <code class="hljs inline no-lang">DeleteCommandParser</code>, ...) inherit from the <code class="hljs inline no-lang">Parser</code> interface so that they can be treated similarly where possible e.g, during testing.</li></ul> <h3 id="model-component">Model component<a href="#model-component" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><strong>API</strong> : <a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/blob/master/src/main/java/seedu/address/model/Model.java"><code class="hljs inline no-lang">Model.java</code></a></p> <span class="image-wrapper"><img src="/tp/diagrams/ModelClassDiagram.png" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The <code class="hljs inline no-lang">Model</code> component,</p> <ul><li>stores the address book data i.e., all <code class="hljs inline no-lang">Person</code> objects (which are contained in a <code class="hljs inline no-lang">UniquePersonList</code> object).</li> <li>stores the currently 'selected' <code class="hljs inline no-lang">Person</code> objects (e.g., results of a search query) as a separate <em>filtered</em> list which is exposed to outsiders as an unmodifiable <code class="hljs inline no-lang">ObservableList<Person></code> that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.</li> <li>stores a <code class="hljs inline no-lang">UserPref</code> object that represents the user’s preferences. This is exposed to the outside as a <code class="hljs inline no-lang">ReadOnlyUserPref</code> objects.</li> <li>does not depend on any of the other three components (as the <code class="hljs inline no-lang">Model</code> represents data entities of the domain, they should make sense on their own without depending on other components)</li></ul> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> An alternative (arguably, a more OOP) model is given below. It has a <code class="hljs inline no-lang" data-v-0eabf1c4>Tag</code> list in the <code class="hljs inline no-lang" data-v-0eabf1c4>AddressBook</code>, which <code class="hljs inline no-lang" data-v-0eabf1c4>Person</code> references. This allows <code class="hljs inline no-lang" data-v-0eabf1c4>AddressBook</code> to only require one <code class="hljs inline no-lang" data-v-0eabf1c4>Tag</code> object per unique tag, instead of each <code class="hljs inline no-lang" data-v-0eabf1c4>Person</code> needing their own <code class="hljs inline no-lang" data-v-0eabf1c4>Tag</code> objects.<br data-v-0eabf1c4></p> <span class="image-wrapper"><img src="/tp/diagrams/BetterModelClassDiagram.png" width="450" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span></div> <!----></div></div></div> <h3 id="storage-component">Storage component<a href="#storage-component" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><strong>API</strong> : <a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/blob/master/src/main/java/seedu/address/storage/Storage.java"><code class="hljs inline no-lang">Storage.java</code></a></p> <span class="image-wrapper"><img src="/tp/diagrams/StorageClassDiagram.png" width="550" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The <code class="hljs inline no-lang">Storage</code> component,</p> <ul><li>can save both address book data and user preference data in JSON format, and read them back into corresponding objects.</li> <li>inherits from both <code class="hljs inline no-lang">AddressBookStorage</code> and <code class="hljs inline no-lang">UserPrefStorage</code>, which means it can be treated as either one (if only the functionality of only one is needed).</li> <li>depends on some classes in the <code class="hljs inline no-lang">Model</code> component (because the <code class="hljs inline no-lang">Storage</code> component's job is to save/retrieve objects that belong to the <code class="hljs inline no-lang">Model</code>)</li></ul> <h3 id="common-classes">Common classes<a href="#common-classes" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>Classes used by multiple components are in the <code class="hljs inline no-lang">seedu.addressbook.commons</code> package.</p> <hr> <h2 id="implementation"><strong>Implementation</strong><a href="#implementation" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This section describes some noteworthy details on how certain features are implemented.</p> <h3 id="view-client-feature">View Client feature<a href="#view-client-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The view client feature allows users to view the details of a client using their <code class="hljs inline no-lang">INDEX</code> on the GUI. This includes information not included in the client list cards, such as their last met and policy list.</p> <h4 id="implementation-2">Implementation<a href="#implementation-2" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The view client mechanism is facilitated by <code class="hljs inline no-lang">DisplayClient</code> in the model. When any command referring to a client using <code class="hljs inline no-lang">INDEX</code> is executed, this DisplayClient is set to the client that was operated on (or cleared to <code class="hljs inline no-lang">null</code> in the case of <code class="hljs inline no-lang">delete</code> and <code class="hljs inline no-lang">clear</code>). +This is done with the <code class="hljs inline no-lang">setDisplayClient()</code> function in the <code class="hljs inline no-lang">Model</code>, that is also implemented in <code class="hljs inline no-lang">Logic</code>.</p> <p>The sequence diagram below shows the execution of <code class="hljs inline no-lang">view 1</code> to view the details of client at index 1.</p> <span class="image-wrapper"><img src="/tp/diagrams/ViewClientSequenceDiagram.png" width="900" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p><code class="hljs inline no-lang">MainWindow</code> handles most of the UI logic in regard to displaying the viewed client on the GUI, including refreshing the <code class="hljs inline no-lang">ClientDetailsPanel</code> and <code class="hljs inline no-lang">ClientPolicyTable</code>. It also sets <code class="hljs inline no-lang">DisplayClient</code> on startup when there is at least one client in the list.</p> <h3 id="adding-notes-to-client-feature">Adding notes to client feature<a href="#adding-notes-to-client-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h3 id="sorting-clients-feature">Sorting clients feature<a href="#sorting-clients-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h3 id="updating-last-met-feature">Updating last met feature<a href="#updating-last-met-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The last met feature allows users to keep track and update their last interaction with their clients.</p> <h4 id="implementation-3">Implementation<a href="#implementation-3" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The updating of last met command is facilitated by the <code class="hljs inline no-lang">LastMetCommandParser</code> class which is created by the <code class="hljs inline no-lang">AddressBookParser</code>.</p> <p>The <code class="hljs inline no-lang">LastMetCommandParser#parse()</code> overrides <code class="hljs inline no-lang">Parser#parse()</code> in the <code class="hljs inline no-lang">Parser</code> interface.</p> <ul><li><code class="hljs inline no-lang">LastMetCommandParser#parse()</code> - Parses the input arguments by storing the prefixes of it respective values in a <code class="hljs inline no-lang">ArgumentMultimap</code> object.</li> <li>It will then convert the String input into a Date object before creating a new <code class="hljs inline no-lang">LastMetCommand</code> object with the formatted date.</li></ul> <p>The <code class="hljs inline no-lang">LastMetCommand</code> object is then executed by the <code class="hljs inline no-lang">Logic</code> component.</p> <p>The <code class="hljs inline no-lang">LastMetCommand</code> object then communicates with the <code class="hljs inline no-lang">Model</code> component to update the LastMet to the client. The <code class="hljs inline no-lang">Model</code> component then updates the <code class="hljs inline no-lang">Person</code> object with the new LastMet.</p> <ul><li><code class="hljs inline no-lang">Model#setPerson(Person, Person)</code> - Sets the client in the existing client list to the new <code class="hljs inline no-lang">Person</code> object which has been edited by the <code class="hljs inline no-lang">LastMetCommand#execute()</code> which contains the new LastMet.</li> <li><code class="hljs inline no-lang">Model#setDisplayClient(Person)</code> - Updates the displayed client in the UI to the client that has been edited with the new LastMet.</li></ul> <p>The method <code class="hljs inline no-lang">LastMetCommand#execute()</code> returns a CommandResult object which contains the success message to be displayed to the user.</p> <p>The following object diagram illustrates the above:</p> <span class="image-wrapper"><img src="/tp/diagrams/LastMetObjectDiagram.png" width="600" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The following sequence diagram shows the lastmet operation:</p> <span class="image-wrapper"><img src="/tp/diagrams/LastMetSequenceDiagram.png" width="900" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <h3 id="setting-last-met-overdue-duration-feature">Setting last met overdue duration feature<a href="#setting-last-met-overdue-duration-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h3 id="adding-schedule-feature">Adding schedule feature<a href="#adding-schedule-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h3 id="marking-schedule-feature">Marking schedule feature<a href="#marking-schedule-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h3 id="add-policy-feature">Add policy feature<a href="#add-policy-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The add policy feature allows users to add a policy to a client. The policy is stored in the <code class="hljs inline no-lang">Policy</code> class, which contains the policy details such as policy name, policy id. The <code class="hljs inline no-lang">Policy</code> class is then added to the <code class="hljs inline no-lang">PolicyList</code> object stored within the <code class="hljs inline no-lang">Person</code> object in the <code class="hljs inline no-lang">Model</code> component.</p> <h4 id="implementation-4">Implementation<a href="#implementation-4" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The add policy command mechanism is facilitated by the <code class="hljs inline no-lang">AddPolicyCommandParser</code> class which is created by the <code class="hljs inline no-lang">AddressBookParser</code>.</p> <p>The <code class="hljs inline no-lang">AddPolicyCommandParser</code> class is responsible for parsing the user input and creating an <code class="hljs inline no-lang">AddPolicyCommand</code> object.</p> <p>The <code class="hljs inline no-lang">AddPolicyCommandParser#parse()</code> overrides <code class="hljs inline no-lang">Parser#parse()</code> in the <code class="hljs inline no-lang">Parser</code> interface.</p> <ul><li><code class="hljs inline no-lang">AddPolicyCommandParser#parse()</code> - Parses the input arguments by storing the prefixes of it respective values in a <code class="hljs inline no-lang">ArgumentMultimap</code> object, and creates a new <code class="hljs inline no-lang">AddPolicyCommand</code> object with the parsed policy name and policy ID.</li></ul> <p>The <code class="hljs inline no-lang">AddPolicyCommand</code> object is then executed by the <code class="hljs inline no-lang">Logic</code> component.</p> <p>The <code class="hljs inline no-lang">AddPolicyCommand</code> object then communicates with the <code class="hljs inline no-lang">Model</code> component to add the policy to the client. The <code class="hljs inline no-lang">Model</code> component then updates the <code class="hljs inline no-lang">Person</code> object with the new policy.</p> <ul><li><code class="hljs inline no-lang">Model#setPerson(Person, Person)</code> - Sets the client in the existing client list to the new <code class="hljs inline no-lang">Person</code> object which has been edited by the <code class="hljs inline no-lang">AddPolicyCommand#execute()</code> which contains the new policy.</li> <li><code class="hljs inline no-lang">Model#setDisplayClient(Person)</code> - Updates the displayed client in the UI to the client that has been edited with the new policy.</li></ul> <p>The method <code class="hljs inline no-lang">AddPolicyCommand#execute()</code> returns a CommandResult object which contains the success message to be displayed to the user.</p> <p>The following object diagram illustrates the above:</p> <span class="image-wrapper"><img src="/tp/diagrams/AddPolicyObjectDiagram.png" width="600" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The following sequence diagram shows the addpolicy operation:</p> <span class="image-wrapper"><img src="/tp/diagrams/AddPolicySequenceDiagram.png" width="900" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <h3 id="deleting-policy-feature">Deleting policy feature<a href="#deleting-policy-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h3 id="proposed-undo-redo-feature">[Proposed] Undo/redo feature<a href="#proposed-undo-redo-feature" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <h4 id="proposed-implementation">Proposed Implementation<a href="#proposed-implementation" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p>The proposed undo/redo mechanism is facilitated by <code class="hljs inline no-lang">VersionedAddressBook</code>. It extends <code class="hljs inline no-lang">AddressBook</code> with an undo/redo history, stored internally as an <code class="hljs inline no-lang">addressBookStateList</code> and <code class="hljs inline no-lang">currentStatePointer</code>. Additionally, it implements the following operations:</p> <ul><li><code class="hljs inline no-lang">VersionedAddressBook#commit()</code> — Saves the current address book state in its history.</li> <li><code class="hljs inline no-lang">VersionedAddressBook#undo()</code> — Restores the previous address book state from its history.</li> <li><code class="hljs inline no-lang">VersionedAddressBook#redo()</code> — Restores a previously undone address book state from its history.</li></ul> <p>These operations are exposed in the <code class="hljs inline no-lang">Model</code> interface as <code class="hljs inline no-lang">Model#commitAddressBook()</code>, <code class="hljs inline no-lang">Model#undoAddressBook()</code> and <code class="hljs inline no-lang">Model#redoAddressBook()</code> respectively.</p> <p>Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.</p> <p>Step 1. The user launches the application for the first time. The <code class="hljs inline no-lang">VersionedAddressBook</code> will be initialized with the initial address book state, and the <code class="hljs inline no-lang">currentStatePointer</code> pointing to that single address book state.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState0.png" alt="UndoRedoState0" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>Step 2. The user executes <code class="hljs inline no-lang">delete 5</code> command to delete the 5th person in the address book. The <code class="hljs inline no-lang">delete</code> command calls <code class="hljs inline no-lang">Model#commitAddressBook()</code>, causing the modified state of the address book after the <code class="hljs inline no-lang">delete 5</code> command executes to be saved in the <code class="hljs inline no-lang">addressBookStateList</code>, and the <code class="hljs inline no-lang">currentStatePointer</code> is shifted to the newly inserted address book state.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState1.png" alt="UndoRedoState1" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>Step 3. The user executes <code class="hljs inline no-lang">add n/David …</code> to add a new person. The <code class="hljs inline no-lang">add</code> command also calls <code class="hljs inline no-lang">Model#commitAddressBook()</code>, causing another modified address book state to be saved into the <code class="hljs inline no-lang">addressBookStateList</code>.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState2.png" alt="UndoRedoState2" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> If a command fails its execution, it will not call <code class="hljs inline no-lang" data-v-0eabf1c4>Model#commitAddressBook()</code>, so the address book state will not be saved into the <code class="hljs inline no-lang" data-v-0eabf1c4>addressBookStateList</code>.</p></div> <!----></div></div></div> <p>Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the <code class="hljs inline no-lang">undo</code> command. The <code class="hljs inline no-lang">undo</code> command will call <code class="hljs inline no-lang">Model#undoAddressBook()</code>, which will shift the <code class="hljs inline no-lang">currentStatePointer</code> once to the left, pointing it to the previous address book state, and restores the address book to that state.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState3.png" alt="UndoRedoState3" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> If the <code class="hljs inline no-lang" data-v-0eabf1c4>currentStatePointer</code> is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The <code class="hljs inline no-lang" data-v-0eabf1c4>undo</code> command uses <code class="hljs inline no-lang" data-v-0eabf1c4>Model#canUndoAddressBook()</code> to check if this is the case. If so, it will return an error to the user rather than attempting to perform the undo.</p></div> <!----></div></div></div> <p>The following sequence diagram shows how an undo operation goes through the <code class="hljs inline no-lang">Logic</code> component:</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoSequenceDiagram-Logic.png" alt="UndoSequenceDiagram-Logic" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> The lifeline for <code class="hljs inline no-lang" data-v-0eabf1c4>UndoCommand</code> should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.</p></div> <!----></div></div></div> <p>Similarly, how an undo operation goes through the <code class="hljs inline no-lang">Model</code> component is shown below:</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoSequenceDiagram-Model.png" alt="UndoSequenceDiagram-Model" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The <code class="hljs inline no-lang">redo</code> command does the opposite — it calls <code class="hljs inline no-lang">Model#redoAddressBook()</code>, which shifts the <code class="hljs inline no-lang">currentStatePointer</code> once to the right, pointing to the previously undone state, and restores the address book to that state.</p> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> If the <code class="hljs inline no-lang" data-v-0eabf1c4>currentStatePointer</code> is at index <code class="hljs inline no-lang" data-v-0eabf1c4>addressBookStateList.size() - 1</code>, pointing to the latest address book state, then there are no undone AddressBook states to restore. The <code class="hljs inline no-lang" data-v-0eabf1c4>redo</code> command uses <code class="hljs inline no-lang" data-v-0eabf1c4>Model#canRedoAddressBook()</code> to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.</p></div> <!----></div></div></div> <p>Step 5. The user then decides to execute the command <code class="hljs inline no-lang">list</code>. Commands that do not modify the address book, such as <code class="hljs inline no-lang">list</code>, will usually not call <code class="hljs inline no-lang">Model#commitAddressBook()</code>, <code class="hljs inline no-lang">Model#undoAddressBook()</code> or <code class="hljs inline no-lang">Model#redoAddressBook()</code>. Thus, the <code class="hljs inline no-lang">addressBookStateList</code> remains unchanged.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState4.png" alt="UndoRedoState4" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>Step 6. The user executes <code class="hljs inline no-lang">clear</code>, which calls <code class="hljs inline no-lang">Model#commitAddressBook()</code>. Since the <code class="hljs inline no-lang">currentStatePointer</code> is not pointing at the end of the <code class="hljs inline no-lang">addressBookStateList</code>, all address book states after the <code class="hljs inline no-lang">currentStatePointer</code> will be purged. Reason: It no longer makes sense to redo the <code class="hljs inline no-lang">add n/David …</code> command. This is the behavior that most modern desktop applications follow.</p> <span class="image-wrapper"><img src="/tp/diagrams/UndoRedoState5.png" alt="UndoRedoState5" width="" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <p>The following activity diagram summarizes what happens when a user executes a new command:</p> <span class="image-wrapper"><img src="/tp/diagrams/CommitActivityDiagram.png" width="250" height="" loading="eager" class="img-fluid rounded"> <span class="image-caption"></span></span> <h4 id="design-considerations">Design considerations:<a href="#design-considerations" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h4> <p><strong>Aspect: How undo & redo executes:</strong></p> <ul><li><p><strong>Alternative 1 (current choice):</strong> Saves the entire address book.</p> <ul><li>Pros: Easy to implement.</li> <li>Cons: May have performance issues in terms of memory usage.</li></ul></li> <li><p><strong>Alternative 2:</strong> Individual command knows how to undo/redo by -itself.</p> <ul><li>Pros: Will use less memory (e.g. for <code class="hljs inline no-lang">delete</code>, just save the person being deleted).</li> <li>Cons: We must ensure that the implementation of each individual command are correct.</li></ul></li></ul> <p><em>{more aspects and alternatives to be added}</em></p> <h3 id="proposed-data-archiving">[Proposed] Data archiving<a href="#proposed-data-archiving" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><em>{Explain here how the data archiving feature will be implemented}</em></p> <hr> <h2 id="documentation-logging-testing-configuration-dev-ops"><strong>Documentation, logging, testing, configuration, dev-ops</strong><a href="#documentation-logging-testing-configuration-dev-ops" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <ul><li><a href="/tp/Documentation.html">Documentation guide</a></li> <li><a href="/tp/Testing.html">Testing guide</a></li> <li><a href="/tp/Logging.html">Logging guide</a></li> <li><a href="/tp/Configuration.html">Configuration guide</a></li> <li><a href="/tp/DevOps.html">DevOps guide</a></li></ul> <hr> <h2 id="appendix-requirements"><strong>Appendix: Requirements</strong><a href="#appendix-requirements" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <h3 id="product-scope">Product scope<a href="#product-scope" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><strong>Target user profile</strong>:</p> <ul><li>insurance agents</li> <li>has a need to manage a significant number of clients for insurance policies</li> <li>has a need to organise schedules with clients and their details in one place</li> <li>has a need for reminders to keep in touch with clients</li> <li>prefer desktop apps over other types</li> <li>can type fast</li> <li>prefers typing to mouse interactions</li> <li>is reasonably comfortable using CLI apps</li></ul> <p><strong>Value proposition</strong>:</p> <ul><li>conveniently manage client details and schedules faster than a typical mouse/GUI driven app</li> <li>Convenient tracking of when agent last checked up on clients (eg. reminders)</li> <li>Organise client contacts details</li> <li>Optimization by client’s importance (VIP status etc)</li> <li>Monitor client’s insurance policies</li> <li>Scheduler to manage appointment to ensure timely follow-up</li></ul> <h3 id="user-stories">User stories<a href="#user-stories" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>Priorities: High (must have) - <code class="hljs inline no-lang">* * *</code>, Medium (nice to have) - <code class="hljs inline no-lang">* *</code>, Low (unlikely to have) - <code class="hljs inline no-lang">*</code></p> <div class="table-responsive"><table class="markbind-table table table-bordered table-striped"><thead><tr><th>Priority</th> <th>As a …</th> <th>I want to …</th> <th>So that I can…</th></tr></thead> <tbody><tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>see usage instructions</td> <td>refer to instructions when I forget how to use the App</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>add a new client contact details</td> <td>keep track of the clients I have</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>delete a client</td> <td>remove clients that are leaving</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>find a client by name</td> <td>locate details of client without having to go through the entire list</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>list all clients</td> <td>see all clients at a glance</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>view client information</td> <td>know and check client details</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>check schedules with clients on a date</td> <td>keep track of what I have to do in a day</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>add the birthday of my clients</td> <td>wish them happy birthday to keep in contact with them</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>delete policy details for a client</td> <td>remove expired policies of the client</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>see when I last met a client</td> <td>check in on a client that I have not met for a long time</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>mark that a schedule is completed</td> <td>know that i fulfilled the appointment scheduled</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>add policy details of a client</td> <td>keep track of clients and their policies</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>schedule checkup date and time for clients</td> <td>know when to follow-up with them</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>set the overdue period for last met</td> <td>be reminded of a follow-up at my own pace</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>sort clients by priority</td> <td>deal with client with higher priority status first</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>track deals that I have closed</td> <td>track my current progress</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>edit my client's details</td> <td>update my client's details</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>reschedule my appointments</td> <td>change the date and time of appointments with clients</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>filter clients by importance</td> <td>decide on who to prioritise on</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>get help</td> <td>use the app when I am lost or confused</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>can sort clients by the expected revenue of the deals</td> <td>know which clients to prioritise</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>set the policy payment due dates</td> <td>remind my clients.</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>add the maturity date of my client’s policy</td> <td>update them and plan for future policies</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>developer</td> <td>view list of all bugs reported by users</td> <td>conveniently view all reported bugs and fix them</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>colleague</td> <td>import someone's contact list</td> <td>take over his clients</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>report issues/bugs</td> <td>get someone to fix bugs</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>developer</td> <td>get a log list of user activity</td> <td>view user activity to bug fix</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>manager</td> <td>view all my subordinates' clients</td> <td>be aware of their progress and client base</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>get reminders of client birthday</td> <td>send birthday message</td></tr></tbody></table></div><p><em>{More to be added}</em></p> <h3 id="use-cases">Use cases<a href="#use-cases" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>(For all use cases below, the <strong>System</strong> is the <code class="hljs inline no-lang">ClientCare</code> and the <strong>Actor</strong> is the <code class="hljs inline no-lang">user</code>, unless specified otherwise)</p> <p><strong>Use case: UC01 - List all clients</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to view all clients.</li> <li>ClientCare shows a list of all clients.<br> -Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. The list is empty as no clients have been added at all. -<ul><li>1a1. ClientCare lets user know that the list is empty.<br> -Use case ends.</li></ul></li> <li>1b. Invalid command usage in the request. -<ul><li>1b1. ClientCare shows command usage.</li> <li>1b2. User enters new data.<br> -Steps 1b1-1b2 are repeated until the data entered are correct.<br> -Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC02 - View client details and policies</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to view a client's details and policies.</li> <li>ClientCare shows that client's details and policies.<br> -Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. ClientCare detects that the client does not exist. -<ul><li>1a1. ClientCare lets user know that client does not exist.</li> <li>1a2. User enters new data.<br> -Steps 1a1-1a2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li> <li>1b. Invalid command usage in the request. -<ul><li>1b1. ClientCare shows command usage.</li> <li>1b2. User enters new data.<br> -Steps 1b1-1b2 are repeated until the data entered are correct.<br> -Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC03 - Add a new client</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to add new client.</li> <li>ClientCare adds the new client to the list.</li> <li>ClientCare shows a success message and <u>display view of new client details and policies (UC02)</u>.<br> +itself.</p> <ul><li>Pros: Will use less memory (e.g. for <code class="hljs inline no-lang">delete</code>, just save the person being deleted).</li> <li>Cons: We must ensure that the implementation of each individual command are correct.</li></ul></li></ul> <p><em>{more aspects and alternatives to be added}</em></p> <h3 id="proposed-data-archiving">[Proposed] Data archiving<a href="#proposed-data-archiving" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><em>{Explain here how the data archiving feature will be implemented}</em></p> <hr> <h2 id="documentation-logging-testing-configuration-dev-ops"><strong>Documentation, logging, testing, configuration, dev-ops</strong><a href="#documentation-logging-testing-configuration-dev-ops" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <ul><li><a href="/tp/Documentation.html">Documentation guide</a></li> <li><a href="/tp/Testing.html">Testing guide</a></li> <li><a href="/tp/Logging.html">Logging guide</a></li> <li><a href="/tp/Configuration.html">Configuration guide</a></li> <li><a href="/tp/DevOps.html">DevOps guide</a></li></ul> <hr> <h2 id="appendix-requirements"><strong>Appendix: Requirements</strong><a href="#appendix-requirements" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <h3 id="product-scope">Product scope<a href="#product-scope" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p><strong>Target user profile</strong>:</p> <ul><li>insurance agents</li> <li>has a need to manage a significant number of clients for insurance policies</li> <li>has a need to organise schedules with clients and their details in one place</li> <li>has a need for reminders to keep in touch with clients</li> <li>prefer desktop apps over other types</li> <li>can type fast</li> <li>prefers typing to mouse interactions</li> <li>is reasonably comfortable using CLI apps</li></ul> <p><strong>Value proposition</strong>:</p> <ul><li>conveniently manage client details and schedules faster than a typical mouse/GUI driven app</li> <li>Convenient tracking of when agent last checked up on clients (eg. reminders)</li> <li>Organise client contacts details</li> <li>Optimization by client’s importance (VIP status etc)</li> <li>Monitor client’s insurance policies</li> <li>Scheduler to manage appointment to ensure timely follow-up</li></ul> <h3 id="user-stories">User stories<a href="#user-stories" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>Priorities: High (must have) - <code class="hljs inline no-lang">* * *</code>, Medium (nice to have) - <code class="hljs inline no-lang">* *</code>, Low (unlikely to have) - <code class="hljs inline no-lang">*</code></p> <div class="table-responsive"><table class="markbind-table table table-bordered table-striped"><thead><tr><th>Priority</th> <th>As a …</th> <th>I want to …</th> <th>So that I can…</th></tr></thead> <tbody><tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>see usage instructions</td> <td>refer to instructions when I forget how to use the App</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>add a new client contact details</td> <td>keep track of the clients I have</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>delete a client</td> <td>remove clients that are leaving</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>find a client by name</td> <td>locate details of client without having to go through the entire list</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>list all clients</td> <td>see all clients at a glance</td></tr> <tr><td><code class="hljs inline no-lang">* * *</code></td> <td>insurance agent</td> <td>view client information</td> <td>know and check client details</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>check schedules with clients on a date</td> <td>keep track of what I have to do in a day</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>add the birthday of my clients</td> <td>wish them happy birthday to keep in contact with them</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>delete policy details for a client</td> <td>remove expired policies of the client</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>see when I last met a client</td> <td>check in on a client that I have not met for a long time</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>mark that a schedule is completed</td> <td>know that i fulfilled the appointment scheduled</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>add policy details of a client</td> <td>keep track of clients and their policies</td></tr> <tr><td><code class="hljs inline no-lang">* *</code></td> <td>insurance agent</td> <td>schedule checkup date and time for clients</td> <td>know when to follow-up with them</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>set the overdue period for last met</td> <td>be reminded of a follow-up at my own pace</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>sort clients by priority</td> <td>deal with client with higher priority status first</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>track deals that I have closed</td> <td>track my current progress</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>edit my client's details</td> <td>update my client's details</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>reschedule my appointments</td> <td>change the date and time of appointments with clients</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>filter clients by importance</td> <td>decide on who to prioritise on</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>get help</td> <td>use the app when I am lost or confused</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>can sort clients by the expected revenue of the deals</td> <td>know which clients to prioritise</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>set the policy payment due dates</td> <td>remind my clients.</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>add the maturity date of my client’s policy</td> <td>update them and plan for future policies</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>developer</td> <td>view list of all bugs reported by users</td> <td>conveniently view all reported bugs and fix them</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>colleague</td> <td>import someone's contact list</td> <td>take over his clients</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>report issues/bugs</td> <td>get someone to fix bugs</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>developer</td> <td>get a log list of user activity</td> <td>view user activity to bug fix</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>manager</td> <td>view all my subordinates' clients</td> <td>be aware of their progress and client base</td></tr> <tr><td><code class="hljs inline no-lang">*</code></td> <td>insurance agent</td> <td>get reminders of client birthday</td> <td>send birthday message</td></tr></tbody></table></div><p><em>{More to be added}</em></p> <h3 id="use-cases">Use cases<a href="#use-cases" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>(For all use cases below, the <strong>System</strong> is the <code class="hljs inline no-lang">ClientCare</code> and the <strong>Actor</strong> is the <code class="hljs inline no-lang">user</code>, unless specified otherwise)</p> <p><strong>Use case: UC01 - Add new client</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to add new client.</li> <li>ClientCare adds the new client to the list.</li> <li>ClientCare shows a success message and <u>display view of new client details and policies (UC02)</u>.<br> Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. ClientCare detects invalid user information. <ul><li>1a1. ClientCare shows what is wrong with various invalid user information.</li> <li>1a2. User enters new data.<br> Steps 1a1-1a2 are repeated until the data entered are correct.<br> @@ -46,12 +33,7 @@ Use case resumes from step 2.</li></ul></li> <li>1c. Client name already exists. <ul><li>1c1. ClientCare lets user know that duplicate names are not allowed.</li> <li>1c2. User enters new data.<br> Steps 1c1-1c2 are repeated until the data entered are correct.<br> -Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC04 - Find a client by name</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to find a specific client in the list by name.</li> <li>ClientCare shows list of client that matches the name.<br> -Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>2a. The list is empty as there is no matching name found.<br> <ul><li>2a1. ClientCare lets user know that the list is empty.<br> -Use case ends.</li></ul></li> <li>2b. Invalid command usage in the request. -<ul><li>2b1. ClientCare shows command usage.</li> <li>2b2. User enters new data.<br> -Steps 2b1-2b2 are repeated until the data entered are correct.<br> -Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC05 - Delete a client</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to <u>list all clients (UC01)</u> or <u>find client by name (UC04)</u>.</li> <li>ClientCare shows a list of clients.</li> <li>User requests to delete a specific client in the list by index.</li> <li>ClientCare deletes the client.<br> +Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC02 - Delete client</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to <u>list all clients (UC01)</u> or <u>find client by name (UC04)</u>.</li> <li>ClientCare shows a list of clients.</li> <li>User requests to delete a specific client in the list by index.</li> <li>ClientCare deletes the client.<br> Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>2a. The list is empty.<br> <ul><li>2a1. ClientCare lets user know that the list is empty.<br> Use case ends.</li></ul></li> <li>3a. The given index is invalid. <ul><li>3a1. ClientCare lets user know that client index should be a number.</li> <li>3a2. User enters new data.<br> @@ -62,7 +44,51 @@ Use case resumes from step 4.</li></ul></li> <li>3c. Client does not exist. <ul><li>3c1. ClientCare lets user know that client does not exist.</li> <li>3c2. User enters new data.<br> Steps 3c1-3c2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li></ul> <p><strong>Use case: UC06 - Schedule an appointment with client</strong></p> <p><strong>MSS</strong></p> <ol><li>User schedules a date and time to meet with a client.</li> <li>ClientCare sets up the appointment.<br> +Use case ends.</li></ul></li></ul> <p><strong>Use case: UC03 - Edit client</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to view all clients.</li> <li>ClientCare shows a list of all clients.<br> +Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. The list is empty as no clients have been added at all. +<ul><li>1a1. ClientCare lets user know that the list is empty.<br> +Use case ends.</li></ul></li> <li>1b. Invalid command usage in the request. +<ul><li>1b1. ClientCare shows command usage.</li> <li>1b2. User enters new data.<br> +Steps 1b1-1b2 are repeated until the data entered are correct.<br> +Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC04 - List all clients</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to view all clients.</li> <li>ClientCare shows a list of all clients.<br> +Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. The list is empty as no clients have been added at all. +<ul><li>1a1. ClientCare lets user know that the list is empty.<br> +Use case ends.</li></ul></li> <li>1b. Invalid command usage in the request. +<ul><li>1b1. ClientCare shows command usage.</li> <li>1b2. User enters new data.<br> +Steps 1b1-1b2 are repeated until the data entered are correct.<br> +Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC05 - View client details and policies</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to view a client's details and policies.</li> <li>ClientCare shows that client's details and policies.<br> +Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. ClientCare detects that the client does not exist. +<ul><li>1a1. ClientCare lets user know that client does not exist.</li> <li>1a2. User enters new data.<br> +Steps 1a1-1a2 are repeated until the data entered are correct.<br> +Use case ends.</li></ul></li> <li>1b. Invalid command usage in the request. +<ul><li>1b1. ClientCare shows command usage.</li> <li>1b2. User enters new data.<br> +Steps 1b1-1b2 are repeated until the data entered are correct.<br> +Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC06 - Find a client by name</strong></p> <p><strong>MSS</strong></p> <ol><li>User requests to find a specific client in the list by name.</li> <li>ClientCare shows list of client that matches the name.<br> +Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>2a. The list is empty as there is no matching name found.<br> <ul><li>2a1. ClientCare lets user know that the list is empty.<br> +Use case ends.</li></ul></li> <li>2b. Invalid command usage in the request. +<ul><li>2b1. ClientCare shows command usage.</li> <li>2b2. User enters new data.<br> +Steps 2b1-2b2 are repeated until the data entered are correct.<br> +Use case resumes from step 2.</li></ul></li></ul> <p><strong>Use case: UC07 - Adding remark to client</strong></p> <p><strong>MSS</strong></p> <ol><li>PLACEHOLDER</li></ol> <p><strong>Extensions</strong></p> <p><strong>Use case: UC08 - Clear all client</strong></p> <p><strong>MSS</strong></p> <ol><li>PLACEHOLDER</li></ol> <p><strong>Extensions</strong></p> <p><strong>Use case: UC09 - Sort clients</strong></p> <p><strong>MSS</strong></p> <ol><li>PLACEHOLDER</li></ol> <p><strong>Extensions</strong></p> <p><strong>Use case: UC10 - Update client as met</strong></p> <p><strong>MSS</strong></p> <ol><li>User marks a client as met.</li> <li>ClientCare updates Last Met date of client.<br> +Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. Client does not exist. +<ul><li>1a1. ClientCare lets user know that client does not exist.</li> <li>1a2. User enters new data.<br> +Steps 1a1-1a2 are repeated until the data entered are correct.<br> +Use case ends.</li></ul></li> <li>1b. Invalid date format. +<ul><li>1b1. ClientCare lets user know of correct date and time format.</li> <li>1b2. User enters new data.<br> +Steps 1b1-1b2 are repeated until the data entered are correct.<br> +Use case ends.</li></ul></li> <li>1c. Invalid command usage in the request. +<ul><li>1c1. ClientCare shows command usage.</li> <li>1c2. User enters new data.<br> +Steps 1d1-1d2 are repeated until the data entered are correct.<br> +Use case ends.</li></ul></li> <li>1d. Future date. +<ul><li>1d1. ClientCare lets user know he cannot meet someone in the future.</li> <li>1d2. User enters new data.<br> +Steps 1d1-1d2 are repeated until the data entered are correct.<br> +Use case ends.</li></ul></li></ul> <p><strong>Use case: UC11 - Update last met overdue duration</strong></p> <p><strong>MSS</strong></p> <ol><li>User enters the last met overdue duration to the new desired value.</li> <li>ClientCare updates the new last met overdue duration.<br> +Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. The input entered is not a non-negative integer. +<ul><li>1a1. ClientCare lets user know that the input is not accepted.</li> <li>1a2. User enters new data.<br> +Steps 1a1-1a2 are repeated until the data entered are correct.<br> +Use case ends.</li></ul></li> <li>1b. Invalid command usage in the request. +<ul><li>1b1. ClientCare shows command usage.</li> <li>1b2. User enters new data.<br> +Steps 1b1-1b2 are repeated until the data entered are correct.<br> +Use case ends.</li></ul></li></ul> <p><strong>Use case: UC12 - Schedule an appointment with client</strong></p> <p><strong>MSS</strong></p> <ol><li>User schedules a date and time to meet with a client.</li> <li>ClientCare sets up the appointment.<br> Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. Date and time is invalid. <ul><li>1a1. ClientCare lets user know of valid date and time format.</li> <li>1a2. User enters new data.<br> Steps 1a1-1a2 are repeated until the data entered are correct.<br> @@ -72,36 +98,21 @@ Use case ends.</li></ul></li> <li>1c. Invalid command usage in the request. <ul><li>1c1. ClientCare shows command usage.</li> <li>1c2. User enters new data.<br> Steps 1c1-1c2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li></ul> <p><strong>Use case: UC07 - Update client as met</strong></p> <p><strong>MSS</strong></p> <ol><li>User marks a client as met.</li> <li>ClientCare updates Last Met date of client.<br> -Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. Client does not exist. -<ul><li>1a1. ClientCare lets user know that client does not exist.</li> <li>1a2. User enters new data.<br> -Steps 1a1-1a2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li> <li>1b. Invalid date and time. -<ul><li>1b1. ClientCare lets user know of correct date and time format.</li> <li>1b2. User enters new data.<br> -Steps 1b1-1b2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li> <li>1c. Date and time is before the last met date. -<ul><li>1c1. ClientCare confirms if user wants to change last met to an earlier date.</li> <li>1c2. User confirms or rejects.<br> -Use case ends.</li></ul></li> <li>1d. Invalid command usage in the request. -<ul><li>1d1. ClientCare shows command usage.</li> <li>1d2. User enters new data.<br> -Steps 1d1-1d2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li></ul> <p><strong>Use case: UC08 - Mark appointment</strong></p> <p><strong>MSS</strong></p> <ol><li>User marks an appointment with client as done.</li> <li>ClientCare updates appointment has done and updates last met.<br> +Use case ends.</li></ul></li></ul> <p><strong>Use case: UC13 - Mark appointment</strong></p> <p><strong>MSS</strong></p> <ol><li>User marks an appointment with client as done.</li> <li>ClientCare updates appointment has done and updates last met.<br> Use case ends.</li></ol> <p><strong>Extensions</strong></p> <ul><li>1a. Appointment does not exist or is already marked. <ul><li>1a1. ClientCare lets user know that there is no open appointment for this client.<br> Use case ends.</li></ul></li> <li>1b. The client does not exist. <ul><li>1b1. ClientCare shows an error message.</li> <li>1b2. User enters new data.<br> Steps 1b1-1b2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li> <li>1c. Appointment is in the future. -<ul><li>1c1. ClientCare lets user know that future appointment cannot be marked.</li> <li>1c2. User enters new data.<br> -Steps 1c1-1c2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li> <li>1d. Invalid command usage in the request. -<ul><li>1d1. ClientCare shows command usage.</li> <li>1d2. User enters new data.<br> +Use case ends.</li></ul></li> <li>1c. Invalid command usage in the request. +<ul><li>1c1. ClientCare shows command usage.</li> <li>1c2. User enters new data.<br> Steps 1d1-1d2 are repeated until the data entered are correct.<br> -Use case ends.</li></ul></li></ul> <p><em>{More to be added}</em></p> <h3 id="non-functional-requirements">Non-Functional Requirements<a href="#non-functional-requirements" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ol><li>Should work on any <em>mainstream OS</em> as long as it has Java <code class="hljs inline no-lang">11</code> or above installed.</li> <li>Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.</li> <li>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.</li> <li>The system should respond to user input within 2 seconds.</li> <li>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.</li> <li>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.</li></ol> <p><em>{More to be added}</em></p> <h3 id="glossary">Glossary<a href="#glossary" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ul><li><strong>Client</strong>: Customers or potential customers the insurance agent wants to keep in contact with</li> <li><strong>Command Line Interface (CLI)</strong>: A text-based interface to input commands to interact with the system</li> <li><strong>Graphical User Interface (GUI)</strong>: A visual interface to interact with the system</li> <li><strong>Mainstream OS</strong>: Windows, Linux, Unix, MacOS</li> <li><strong>AddressBook</strong>: The underlying system that ClientCare is built on. Interchangeable with ClientCare</li> <li><strong>Client Priority</strong>: The level of importance or significance assigned to a client, which may influence the order of interactions or services provided</li> <li><strong>Policy</strong>: An agreement or contract between an insurance company and a client, specifying the terms and conditions of insurance coverage</li> <li><strong>Scheduler</strong>: A feature of the ClientCare application that allows users to manage and organize appointments and follow-ups with clients</li> <li><strong>Reminder</strong>: A notification or alert generated by the ClientCare application to remind users of upcoming appointments or follow-ups with clients</li> <li><strong>Last Met</strong>: The date on which the user last interacted with a client, used for tracking and monitoring client interactions</li> <li><strong>Refresh</strong>: A command or action that updates the information displayed in the ClientCare application to reflect the most recent data</li> <li><strong>Help</strong>: A feature of the ClientCare application that provides assistance, guidance, or instructions to users on how to use the application</li></ul> <hr> <h2 id="appendix-instructions-for-manual-testing"><strong>Appendix: Instructions for manual testing</strong><a href="#appendix-instructions-for-manual-testing" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>Given below are instructions to test the app manually.</p> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> These instructions only provide a starting point for testers to work on; +Use case ends.</li></ul></li></ul> <p><strong>Use case: UC14 - Add policies to client</strong></p> <p><strong>MSS</strong></p> <ol><li>PLACEHOLDER</li></ol> <p><strong>Extensions</strong> <em>{More to be added}</em></p> <p><strong>Use case: UC15 - Delete policies from client</strong></p> <p><strong>MSS</strong></p> <ol><li>PLACEHOLDER</li></ol> <p><strong>Extensions</strong></p> <p><strong>Use case: UC16 - Display help</strong></p> <p><strong>MSS</strong></p> <ol><li>PLACEHOLDER</li></ol> <p><strong>Extensions</strong></p> <p><strong>Use case: UC17- Exit program</strong></p> <p><strong>MSS</strong></p> <ol><li>PLACEHOLDER</li></ol> <p><strong>Extensions</strong></p> <h3 id="non-functional-requirements">Non-Functional Requirements<a href="#non-functional-requirements" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ol><li>Should work on any <em>mainstream OS</em> as long as it has Java <code class="hljs inline no-lang">11</code> or above installed.</li> <li>Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.</li> <li>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.</li> <li>The system should respond to user input within 2 seconds.</li> <li>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.</li> <li>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.</li></ol> <p><em>{More to be added}</em></p> <h3 id="glossary">Glossary<a href="#glossary" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ul><li><strong>Client</strong>: Customers or potential customers the insurance agent wants to keep in contact with</li> <li><strong>Command Line Interface (CLI)</strong>: A text-based interface to input commands to interact with the system</li> <li><strong>Graphical User Interface (GUI)</strong>: A visual interface to interact with the system</li> <li><strong>Mainstream OS</strong>: Windows, Linux, Unix, MacOS</li> <li><strong>AddressBook</strong>: The underlying system that ClientCare is built on. Interchangeable with ClientCare</li> <li><strong>Client Priority</strong>: The level of importance or significance assigned to a client, which may influence the order of interactions or services provided</li> <li><strong>Policy</strong>: An agreement or contract between an insurance company and a client, specifying the terms and conditions of insurance coverage</li> <li><strong>Scheduler</strong>: A feature of the ClientCare application that allows users to manage and organize appointments and follow-ups with clients</li> <li><strong>Reminder</strong>: A notification or alert generated by the ClientCare application to remind users of upcoming appointments or follow-ups with clients</li> <li><strong>Last Met</strong>: The date on which the user last interacted with a client, used for tracking and monitoring client interactions</li> <li><strong>Refresh</strong>: A command or action that updates the information displayed in the ClientCare application to reflect the most recent data</li> <li><strong>Help</strong>: A feature of the ClientCare application that provides assistance, guidance, or instructions to users on how to use the application</li></ul> <hr> <h2 id="appendix-instructions-for-manual-testing"><strong>Appendix: Instructions for manual testing</strong><a href="#appendix-instructions-for-manual-testing" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>Given below are instructions to test the app manually.</p> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Note:</strong> These instructions only provide a starting point for testers to work on; testers are expected to do more <em data-v-0eabf1c4>exploratory</em> testing.</p></div> <!----></div></div></div> <h3 id="launch-and-shutdown">Launch and shutdown<a href="#launch-and-shutdown" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ol><li><p>Initial launch</p> <ol><li><p>Download the jar file and copy into an empty folder</p></li> <li><p>Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.</p></li></ol></li> <li><p>Saving window preferences</p> <ol><li><p>Resize the window to an optimum size. Move the window to a different location. Close the window.</p></li> <li><p>Re-launch the app by double-clicking the jar file.<br> Expected: The most recent window size and location is retained.</p></li></ol></li> <li><p><em>{ more test cases … }</em></p></li></ol> <h3 id="deleting-a-person">Deleting a person<a href="#deleting-a-person" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ol><li><p>Deleting a person while all persons are being shown</p> <ol><li><p>Prerequisites: List all persons using the <code class="hljs inline no-lang">list</code> command. Multiple persons in the list.</p></li> <li><p>Test case: <code class="hljs inline no-lang">delete 1</code><br> 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.</p></li> <li><p>Test case: <code class="hljs inline no-lang">delete 0</code><br> Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.</p></li> <li><p>Other incorrect delete commands to try: <code class="hljs inline no-lang">delete</code>, <code class="hljs inline no-lang">delete x</code>, <code class="hljs inline no-lang">...</code> (where x is larger than the list size)<br> -Expected: Similar to previous.</p></li></ol></li> <li><p><em>{ more test cases … }</em></p></li></ol> <h3 id="saving-data">Saving data<a href="#saving-data" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ol><li><p>Dealing with missing/corrupted data files</p> <ol><li><em>{explain how to simulate a missing/corrupted file, and the expected behavior}</em></li></ol></li> <li><p><em>{ more test cases … }</em></p></li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#clientcare" data-v-e6005420>ClientCare</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#acknowledgements" data-v-e6005420>Acknowledgements</a> <a class="nav-link py-1" href="#setting-up-getting-started" data-v-e6005420>Setting up, getting started</a> <a class="nav-link py-1" href="#design" data-v-e6005420>Design</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#architecture" data-v-e6005420>Architecture</a> <a class="nav-link py-1" href="#ui-component" data-v-e6005420>UI component</a> <a class="nav-link py-1" href="#logic-component" data-v-e6005420>Logic component</a> <a class="nav-link py-1" href="#model-component" data-v-e6005420>Model component</a> <a class="nav-link py-1" href="#storage-component" data-v-e6005420>Storage component</a> <a class="nav-link py-1" href="#common-classes" data-v-e6005420>Common classes</a></nav> <a class="nav-link py-1" href="#implementation" data-v-e6005420>Implementation</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#updating-last-met-feature" data-v-e6005420>Updating last met feature</a> <a class="nav-link py-1" href="#add-policy-feature" data-v-e6005420>Add policy feature</a> <a class="nav-link py-1" href="#view-client-feature" data-v-e6005420>View Client feature</a> <a class="nav-link py-1" href="#proposed-undo-redo-feature" data-v-e6005420>[Proposed] Undo/redo feature</a> <a class="nav-link py-1" href="#proposed-data-archiving" data-v-e6005420>[Proposed] Data archiving</a></nav> <a class="nav-link py-1" href="#documentation-logging-testing-configuration-dev-ops" data-v-e6005420>Documentation, logging, testing, configuration, dev-ops</a> <a class="nav-link py-1" href="#appendix-requirements" data-v-e6005420>Appendix: Requirements</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#product-scope" data-v-e6005420>Product scope</a> <a class="nav-link py-1" href="#user-stories" data-v-e6005420>User stories</a> <a class="nav-link py-1" href="#use-cases" data-v-e6005420>Use cases</a> <a class="nav-link py-1" href="#non-functional-requirements" data-v-e6005420>Non-Functional Requirements</a> <a class="nav-link py-1" href="#glossary" data-v-e6005420>Glossary</a></nav> <a class="nav-link py-1" href="#appendix-instructions-for-manual-testing" data-v-e6005420>Appendix: Instructions for manual testing</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#launch-and-shutdown" data-v-e6005420>Launch and shutdown</a> <a class="nav-link py-1" href="#deleting-a-person" data-v-e6005420>Deleting a person</a> <a class="nav-link py-1" href="#saving-data" data-v-e6005420>Saving data</a></nav></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +Expected: Similar to previous.</p></li></ol></li> <li><p><em>{ more test cases … }</em></p></li></ol> <h3 id="saving-data">Saving data<a href="#saving-data" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <ol><li><p>Dealing with missing/corrupted data files</p> <ol><li><em>{explain how to simulate a missing/corrupted file, and the expected behavior}</em></li></ol></li> <li><p><em>{ more test cases … }</em></p></li></ol> <h2 id="appendix-planned-enhancements"><strong>Appendix: Planned Enhancements</strong><a href="#appendix-planned-enhancements" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <hr> <h2 id="appendix-effort"><strong>Appendix: Effort</strong><a href="#appendix-effort" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <hr></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#clientcare" data-v-e6005420>ClientCare</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#acknowledgements" data-v-e6005420>Acknowledgements</a> <a class="nav-link py-1" href="#setting-up-getting-started" data-v-e6005420>Setting up, getting started</a> <a class="nav-link py-1" href="#design" data-v-e6005420>Design</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#architecture" data-v-e6005420>Architecture</a> <a class="nav-link py-1" href="#ui-component" data-v-e6005420>UI component</a> <a class="nav-link py-1" href="#logic-component" data-v-e6005420>Logic component</a> <a class="nav-link py-1" href="#model-component" data-v-e6005420>Model component</a> <a class="nav-link py-1" href="#storage-component" data-v-e6005420>Storage component</a> <a class="nav-link py-1" href="#common-classes" data-v-e6005420>Common classes</a></nav> <a class="nav-link py-1" href="#implementation" data-v-e6005420>Implementation</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#view-client-feature" data-v-e6005420>View Client feature</a> <a class="nav-link py-1" href="#adding-notes-to-client-feature" data-v-e6005420>Adding notes to client feature</a> <a class="nav-link py-1" href="#sorting-clients-feature" data-v-e6005420>Sorting clients feature</a> <a class="nav-link py-1" href="#updating-last-met-feature" data-v-e6005420>Updating last met feature</a> <a class="nav-link py-1" href="#setting-last-met-overdue-duration-feature" data-v-e6005420>Setting last met overdue duration feature</a> <a class="nav-link py-1" href="#adding-schedule-feature" data-v-e6005420>Adding schedule feature</a> <a class="nav-link py-1" href="#marking-schedule-feature" data-v-e6005420>Marking schedule feature</a> <a class="nav-link py-1" href="#add-policy-feature" data-v-e6005420>Add policy feature</a> <a class="nav-link py-1" href="#deleting-policy-feature" data-v-e6005420>Deleting policy feature</a> <a class="nav-link py-1" href="#proposed-undo-redo-feature" data-v-e6005420>[Proposed] Undo/redo feature</a> <a class="nav-link py-1" href="#proposed-data-archiving" data-v-e6005420>[Proposed] Data archiving</a></nav> <a class="nav-link py-1" href="#documentation-logging-testing-configuration-dev-ops" data-v-e6005420>Documentation, logging, testing, configuration, dev-ops</a> <a class="nav-link py-1" href="#appendix-requirements" data-v-e6005420>Appendix: Requirements</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#product-scope" data-v-e6005420>Product scope</a> <a class="nav-link py-1" href="#user-stories" data-v-e6005420>User stories</a> <a class="nav-link py-1" href="#use-cases" data-v-e6005420>Use cases</a> <a class="nav-link py-1" href="#non-functional-requirements" data-v-e6005420>Non-Functional Requirements</a> <a class="nav-link py-1" href="#glossary" data-v-e6005420>Glossary</a></nav> <a class="nav-link py-1" href="#appendix-instructions-for-manual-testing" data-v-e6005420>Appendix: Instructions for manual testing</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#launch-and-shutdown" data-v-e6005420>Launch and shutdown</a> <a class="nav-link py-1" href="#deleting-a-person" data-v-e6005420>Deleting a person</a> <a class="nav-link py-1" href="#saving-data" data-v-e6005420>Saving data</a></nav> <a class="nav-link py-1" href="#appendix-planned-enhancements" data-v-e6005420>Appendix: Planned Enhancements</a> <a class="nav-link py-1" href="#appendix-effort" data-v-e6005420>Appendix: Effort</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/DeveloperGuide.page-vue-render.js b/DeveloperGuide.page-vue-render.js index df92f2cf307..ace73840391 100644 --- a/DeveloperGuide.page-vue-render.js +++ b/DeveloperGuide.page-vue-render.js @@ -1,7 +1,7 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/tp/index.html","title":"Home"}},[_v("ClientCare")])]},proxy:true},{key:"right",fn:function(){return [_c('li',[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"data":searchData,"placeholder":"Search","on-hit":searchCallback,"menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/index.html"}},[_v("Home")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/UserGuide.html"}},[_v("User Guide")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/DeveloperGuide.html"}},[_v("Developer Guide")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/AboutUs.html"}},[_v("About Us")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"https://github.com/AY2324S2-CS2103T-W12-1/tp","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})])])])])],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"fw-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Site Map")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/index.html"}},[_v("Home")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html"}},[_v("User Guide")]),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#quick-start"}},[_v("Quick Start")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#features"}},[_v("Features")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#faq"}},[_v("FAQ")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#faq"}},[_v("Command Summary")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html"}},[_v("Developer Guide")]),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#acknowledgements"}},[_v("Acknowledgements")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#setting-up-getting-started"}},[_v("Setting Up")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#design"}},[_v("Design")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#implementation"}},[_v("Implementation")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops"}},[_v("Documentation, logging, testing, configuration, dev-ops")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#appendix-requirements"}},[_v("Appendix: Requirements")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#appendix-instructions-for-manual-testing"}},[_v("Appendix: Instructions for manual testing")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Tutorials\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/tutorials/TracingCode.html"}},[_v("Tracing code")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/tutorials/AddRemark.html"}},[_v("Adding a command")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/tutorials/RemovingFields.html"}},[_v("Removing Fields")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/AboutUs.html"}},[_v("About Us")])])])])],1)],1)]),_v(" "),_c('div',{attrs:{"id":"content-wrapper"}},[_m(0),_v(" "),_c('div',{pre:true,attrs:{"class":"page-nav-print d-none d-print-block"}}),_v(" "),_c('hr'),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_c('hr'),_v(" "),_m(3),_v(" "),_m(4),_v(" "),_c('hr'),_v(" "),_m(5),_v(" "),_m(6),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ArchitectureDiagram.png","width":"280"}}),_v(" "),_m(7),_v(" "),_c('p',[_v("Given below is a quick overview of main components and how they interact with each other.")]),_v(" "),_m(8),_v(" "),_m(9),_v(" "),_m(10),_v(" "),_c('p',[_v("The bulk of the app's work is done by the following four components:")]),_v(" "),_m(11),_v(" "),_m(12),_v(" "),_m(13),_v(" "),_m(14),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ArchitectureSequenceDiagram.png","width":"574"}}),_v(" "),_c('p',[_v("Each of the four main components (also shown in the diagram above),")]),_v(" "),_m(15),_v(" "),_m(16),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ComponentManagers.png","width":"300"}}),_v(" "),_c('p',[_v("The sections below give more details of each component.")]),_v(" "),_m(17),_v(" "),_m(18),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UiClassDiagram.png","alt":"Structure of the UI Component"}}),_v(" "),_m(19),_v(" "),_m(20),_v(" "),_m(21),_v(" "),_m(22),_v(" "),_m(23),_v(" "),_m(24),_v(" "),_m(25),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/LogicClassDiagram.png","width":"550"}}),_v(" "),_m(26),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/DeleteSequenceDiagram.png","alt":"Interactions Inside the Logic Component for the `delete 1` Command"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" The lifeline for "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("DeleteCommandParser")]),_v(" should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.")])]),_v(" "),_m(27),_v(" "),_m(28),_v(" "),_m(29),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ParserClasses.png","width":"600"}}),_v(" "),_c('p',[_v("How the parsing works:")]),_v(" "),_m(30),_v(" "),_m(31),_v(" "),_m(32),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ModelClassDiagram.png"}}),_v(" "),_m(33),_v(" "),_m(34),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" An alternative (arguably, a more OOP) model is given below. It has a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Tag")]),_v(" list in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddressBook")]),_v(", which "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Person")]),_v(" references. This allows "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddressBook")]),_v(" to only require one "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Tag")]),_v(" object per unique tag, instead of each "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Person")]),_v(" needing their own "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Tag")]),_v(" objects."),_c('br')]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/BetterModelClassDiagram.png","width":"450"}})],1),_v(" "),_m(35),_v(" "),_m(36),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/StorageClassDiagram.png","width":"550"}}),_v(" "),_m(37),_v(" "),_m(38),_v(" "),_m(39),_v(" "),_m(40),_v(" "),_c('hr'),_v(" "),_m(41),_v(" "),_c('p',[_v("This section describes some noteworthy details on how certain features are implemented.")]),_v(" "),_m(42),_v(" "),_c('p',[_v("The last met feature allows users to keep track and update their last interaction with their clients.")]),_v(" "),_m(43),_v(" "),_m(44),_v(" "),_m(45),_v(" "),_m(46),_v(" "),_m(47),_v(" "),_m(48),_v(" "),_m(49),_v(" "),_m(50),_v(" "),_c('p',[_v("The following object diagram illustrates the above:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/LastMetObjectDiagram.png","width":"600"}}),_v(" "),_c('p',[_v("The following sequence diagram shows the lastmet operation:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/LastMetSequenceDiagram.png","width":"900"}}),_v(" "),_m(51),_v(" "),_m(52),_v(" "),_m(53),_v(" "),_m(54),_v(" "),_m(55),_v(" "),_m(56),_v(" "),_m(57),_v(" "),_m(58),_v(" "),_m(59),_v(" "),_m(60),_v(" "),_m(61),_v(" "),_c('p',[_v("The following object diagram illustrates the above:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/AddPolicyObjectDiagram.png","width":"600"}}),_v(" "),_c('p',[_v("The following sequence diagram shows the addpolicy operation:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/AddPolicySequenceDiagram.png","width":"900"}}),_v(" "),_m(62),_v(" "),_m(63),_v(" "),_m(64),_v(" "),_m(65),_v(" "),_m(66),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ViewClientSequenceDiagram.png","width":"900"}}),_v(" "),_m(67),_v(" "),_m(68),_v(" "),_m(69),_v(" "),_m(70),_v(" "),_m(71),_v(" "),_m(72),_v(" "),_c('p',[_v("Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.")]),_v(" "),_m(73),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState0.png","alt":"UndoRedoState0"}}),_v(" "),_m(74),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState1.png","alt":"UndoRedoState1"}}),_v(" "),_m(75),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState2.png","alt":"UndoRedoState2"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" If a command fails its execution, it will not call "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model#commitAddressBook()")]),_v(", so the address book state will not be saved into the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("addressBookStateList")]),_v(".")])]),_v(" "),_m(76),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState3.png","alt":"UndoRedoState3"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" If the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("currentStatePointer")]),_v(" is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("undo")]),_v(" command uses "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model#canUndoAddressBook()")]),_v(" to check if this is the case. If so, it will return an error to the user rather\nthan attempting to perform the undo.")])]),_v(" "),_m(77),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoSequenceDiagram-Logic.png","alt":"UndoSequenceDiagram-Logic"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" The lifeline for "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("UndoCommand")]),_v(" should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.")])]),_v(" "),_m(78),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoSequenceDiagram-Model.png","alt":"UndoSequenceDiagram-Model"}}),_v(" "),_m(79),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" If the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("currentStatePointer")]),_v(" is at index "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("addressBookStateList.size() - 1")]),_v(", pointing to the latest address book state, then there are no undone AddressBook states to restore. The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("redo")]),_v(" command uses "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model#canRedoAddressBook()")]),_v(" to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.")])]),_v(" "),_m(80),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState4.png","alt":"UndoRedoState4"}}),_v(" "),_m(81),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState5.png","alt":"UndoRedoState5"}}),_v(" "),_c('p',[_v("The following activity diagram summarizes what happens when a user executes a new command:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/CommitActivityDiagram.png","width":"250"}}),_v(" "),_m(82),_v(" "),_m(83),_v(" "),_m(84),_v(" "),_m(85),_v(" "),_m(86),_v(" "),_m(87),_v(" "),_c('hr'),_v(" "),_m(88),_v(" "),_m(89),_v(" "),_c('hr'),_v(" "),_m(90),_v(" "),_m(91),_v(" "),_m(92),_v(" "),_m(93),_v(" "),_m(94),_v(" "),_m(95),_v(" "),_m(96),_v(" "),_m(97),_v(" "),_m(98),_m(99),_v(" "),_m(100),_v(" "),_m(101),_v(" "),_m(102),_v(" "),_m(103),_v(" "),_m(104),_v(" "),_m(105),_v(" "),_m(106),_v(" "),_m(107),_v(" "),_m(108),_v(" "),_m(109),_v(" "),_m(110),_v(" "),_m(111),_v(" "),_m(112),_v(" "),_m(113),_v(" "),_m(114),_v(" "),_m(115),_v(" "),_m(116),_v(" "),_m(117),_v(" "),_m(118),_v(" "),_m(119),_v(" "),_m(120),_v(" "),_m(121),_v(" "),_m(122),_v(" "),_m(123),_v(" "),_m(124),_v(" "),_m(125),_v(" "),_m(126),_v(" "),_m(127),_v(" "),_m(128),_v(" "),_m(129),_v(" "),_m(130),_v(" "),_m(131),_v(" "),_m(132),_v(" "),_m(133),_v(" "),_m(134),_v(" "),_m(135),_v(" "),_m(136),_v(" "),_m(137),_v(" "),_m(138),_v(" "),_m(139),_v(" "),_m(140),_v(" "),_m(141),_v(" "),_m(142),_v(" "),_m(143),_v(" "),_m(144),_v(" "),_m(145),_v(" "),_m(146),_v(" "),_m(147),_v(" "),_c('hr'),_v(" "),_m(148),_v(" "),_c('p',[_v("Given below are instructions to test the app manually.")]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" These instructions only provide a starting point for testers to work on;\ntesters are expected to do more "),_c('em',[_v("exploratory")]),_v(" testing.")])]),_v(" "),_m(149),_v(" "),_m(150),_v(" "),_m(151),_v(" "),_m(152),_v(" "),_m(153),_v(" "),_m(154)],1),_v(" "),_c('overlay-source',{attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#clientcare"}},[_v("ClientCare")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#acknowledgements"}},[_v("Acknowledgements")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#setting-up-getting-started"}},[_v("Setting up, getting started")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#design"}},[_v("Design")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#architecture"}},[_v("Architecture")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#ui-component"}},[_v("UI component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#logic-component"}},[_v("Logic component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#model-component"}},[_v("Model component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#storage-component"}},[_v("Storage component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#common-classes"}},[_v("Common classes")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#implementation"}},[_v("Implementation")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#updating-last-met-feature"}},[_v("Updating last met feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#add-policy-feature"}},[_v("Add policy feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#view-client-feature"}},[_v("View Client feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#proposed-undo-redo-feature"}},[_v("[Proposed] Undo/redo feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#proposed-data-archiving"}},[_v("[Proposed] Data archiving")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#documentation-logging-testing-configuration-dev-ops"}},[_v("Documentation, logging, testing, configuration, dev-ops")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#appendix-requirements"}},[_v("Appendix: Requirements")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#product-scope"}},[_v("Product scope")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#user-stories"}},[_v("User stories")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#use-cases"}},[_v("Use cases")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#non-functional-requirements"}},[_v("Non-Functional Requirements")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#glossary"}},[_v("Glossary")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#appendix-instructions-for-manual-testing"}},[_v("Appendix: Instructions for manual testing")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#launch-and-shutdown"}},[_v("Launch and shutdown")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#deleting-a-person"}},[_v("Deleting a person")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#saving-data"}},[_v("Saving data")])])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(155)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/tp/index.html","title":"Home"}},[_v("ClientCare")])]},proxy:true},{key:"right",fn:function(){return [_c('li',[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"data":searchData,"placeholder":"Search","on-hit":searchCallback,"menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/index.html"}},[_v("Home")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/UserGuide.html"}},[_v("User Guide")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/DeveloperGuide.html"}},[_v("Developer Guide")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/tp/AboutUs.html"}},[_v("About Us")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"https://github.com/AY2324S2-CS2103T-W12-1/tp","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})])])])])],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"fw-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Site Map")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/index.html"}},[_v("Home")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html"}},[_v("User Guide")]),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#quick-start"}},[_v("Quick Start")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#features"}},[_v("Features")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#faq"}},[_v("FAQ")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/UserGuide.html#faq"}},[_v("Command Summary")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html"}},[_v("Developer Guide")]),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#acknowledgements"}},[_v("Acknowledgements")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#setting-up-getting-started"}},[_v("Setting Up")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#design"}},[_v("Design")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#implementation"}},[_v("Implementation")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops"}},[_v("Documentation, logging, testing, configuration, dev-ops")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#appendix-requirements"}},[_v("Appendix: Requirements")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/DeveloperGuide.html#appendix-instructions-for-manual-testing"}},[_v("Appendix: Instructions for manual testing")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Tutorials\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/tutorials/TracingCode.html"}},[_v("Tracing code")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/tutorials/AddRemark.html"}},[_v("Adding a command")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/tutorials/RemovingFields.html"}},[_v("Removing Fields")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/tp/AboutUs.html"}},[_v("About Us")])])])])],1)],1)]),_v(" "),_c('div',{attrs:{"id":"content-wrapper"}},[_m(0),_v(" "),_c('div',{pre:true,attrs:{"class":"page-nav-print d-none d-print-block"}}),_v(" "),_c('hr'),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_c('hr'),_v(" "),_m(3),_v(" "),_m(4),_v(" "),_c('hr'),_v(" "),_m(5),_v(" "),_m(6),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ArchitectureDiagram.png","width":"280"}}),_v(" "),_m(7),_v(" "),_c('p',[_v("Given below is a quick overview of main components and how they interact with each other.")]),_v(" "),_m(8),_v(" "),_m(9),_v(" "),_m(10),_v(" "),_c('p',[_v("The bulk of the app's work is done by the following four components:")]),_v(" "),_m(11),_v(" "),_m(12),_v(" "),_m(13),_v(" "),_m(14),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ArchitectureSequenceDiagram.png","width":"574"}}),_v(" "),_c('p',[_v("Each of the four main components (also shown in the diagram above),")]),_v(" "),_m(15),_v(" "),_m(16),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ComponentManagers.png","width":"300"}}),_v(" "),_c('p',[_v("The sections below give more details of each component.")]),_v(" "),_m(17),_v(" "),_m(18),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UiClassDiagram.png","alt":"Structure of the UI Component"}}),_v(" "),_m(19),_v(" "),_m(20),_v(" "),_m(21),_v(" "),_m(22),_v(" "),_m(23),_v(" "),_m(24),_v(" "),_m(25),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/LogicClassDiagram.png","width":"550"}}),_v(" "),_m(26),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/DeleteSequenceDiagram.png","alt":"Interactions Inside the Logic Component for the `delete 1` Command"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" The lifeline for "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("DeleteCommandParser")]),_v(" should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.")])]),_v(" "),_m(27),_v(" "),_m(28),_v(" "),_m(29),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ParserClasses.png","width":"600"}}),_v(" "),_c('p',[_v("How the parsing works:")]),_v(" "),_m(30),_v(" "),_m(31),_v(" "),_m(32),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ModelClassDiagram.png"}}),_v(" "),_m(33),_v(" "),_m(34),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" An alternative (arguably, a more OOP) model is given below. It has a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Tag")]),_v(" list in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddressBook")]),_v(", which "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Person")]),_v(" references. This allows "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddressBook")]),_v(" to only require one "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Tag")]),_v(" object per unique tag, instead of each "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Person")]),_v(" needing their own "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Tag")]),_v(" objects."),_c('br')]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/BetterModelClassDiagram.png","width":"450"}})],1),_v(" "),_m(35),_v(" "),_m(36),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/StorageClassDiagram.png","width":"550"}}),_v(" "),_m(37),_v(" "),_m(38),_v(" "),_m(39),_v(" "),_m(40),_v(" "),_c('hr'),_v(" "),_m(41),_v(" "),_c('p',[_v("This section describes some noteworthy details on how certain features are implemented.")]),_v(" "),_m(42),_v(" "),_m(43),_v(" "),_m(44),_v(" "),_m(45),_v(" "),_m(46),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/ViewClientSequenceDiagram.png","width":"900"}}),_v(" "),_m(47),_v(" "),_m(48),_v(" "),_m(49),_v(" "),_m(50),_v(" "),_c('p',[_v("The last met feature allows users to keep track and update their last interaction with their clients.")]),_v(" "),_m(51),_v(" "),_m(52),_v(" "),_m(53),_v(" "),_m(54),_v(" "),_m(55),_v(" "),_m(56),_v(" "),_m(57),_v(" "),_m(58),_v(" "),_c('p',[_v("The following object diagram illustrates the above:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/LastMetObjectDiagram.png","width":"600"}}),_v(" "),_c('p',[_v("The following sequence diagram shows the lastmet operation:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/LastMetSequenceDiagram.png","width":"900"}}),_v(" "),_m(59),_v(" "),_m(60),_v(" "),_m(61),_v(" "),_m(62),_v(" "),_m(63),_v(" "),_m(64),_v(" "),_m(65),_v(" "),_m(66),_v(" "),_m(67),_v(" "),_m(68),_v(" "),_m(69),_v(" "),_m(70),_v(" "),_m(71),_v(" "),_m(72),_v(" "),_c('p',[_v("The following object diagram illustrates the above:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/AddPolicyObjectDiagram.png","width":"600"}}),_v(" "),_c('p',[_v("The following sequence diagram shows the addpolicy operation:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/AddPolicySequenceDiagram.png","width":"900"}}),_v(" "),_m(73),_v(" "),_m(74),_v(" "),_m(75),_v(" "),_m(76),_v(" "),_m(77),_v(" "),_m(78),_v(" "),_c('p',[_v("Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.")]),_v(" "),_m(79),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState0.png","alt":"UndoRedoState0"}}),_v(" "),_m(80),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState1.png","alt":"UndoRedoState1"}}),_v(" "),_m(81),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState2.png","alt":"UndoRedoState2"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" If a command fails its execution, it will not call "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model#commitAddressBook()")]),_v(", so the address book state will not be saved into the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("addressBookStateList")]),_v(".")])]),_v(" "),_m(82),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState3.png","alt":"UndoRedoState3"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" If the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("currentStatePointer")]),_v(" is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("undo")]),_v(" command uses "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model#canUndoAddressBook()")]),_v(" to check if this is the case. If so, it will return an error to the user rather\nthan attempting to perform the undo.")])]),_v(" "),_m(83),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoSequenceDiagram-Logic.png","alt":"UndoSequenceDiagram-Logic"}}),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" The lifeline for "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("UndoCommand")]),_v(" should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.")])]),_v(" "),_m(84),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoSequenceDiagram-Model.png","alt":"UndoSequenceDiagram-Model"}}),_v(" "),_m(85),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" If the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("currentStatePointer")]),_v(" is at index "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("addressBookStateList.size() - 1")]),_v(", pointing to the latest address book state, then there are no undone AddressBook states to restore. The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("redo")]),_v(" command uses "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model#canRedoAddressBook()")]),_v(" to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.")])]),_v(" "),_m(86),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState4.png","alt":"UndoRedoState4"}}),_v(" "),_m(87),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/UndoRedoState5.png","alt":"UndoRedoState5"}}),_v(" "),_c('p',[_v("The following activity diagram summarizes what happens when a user executes a new command:")]),_v(" "),_c('pic',{attrs:{"src":"/tp/diagrams/CommitActivityDiagram.png","width":"250"}}),_v(" "),_m(88),_v(" "),_m(89),_v(" "),_m(90),_v(" "),_m(91),_v(" "),_m(92),_v(" "),_m(93),_v(" "),_c('hr'),_v(" "),_m(94),_v(" "),_m(95),_v(" "),_c('hr'),_v(" "),_m(96),_v(" "),_m(97),_v(" "),_m(98),_v(" "),_m(99),_v(" "),_m(100),_v(" "),_m(101),_v(" "),_m(102),_v(" "),_m(103),_v(" "),_m(104),_m(105),_v(" "),_m(106),_v(" "),_m(107),_v(" "),_m(108),_v(" "),_m(109),_v(" "),_m(110),_v(" "),_m(111),_v(" "),_m(112),_v(" "),_m(113),_v(" "),_m(114),_v(" "),_m(115),_v(" "),_m(116),_v(" "),_m(117),_v(" "),_m(118),_v(" "),_m(119),_v(" "),_m(120),_v(" "),_m(121),_v(" "),_m(122),_v(" "),_m(123),_v(" "),_m(124),_v(" "),_m(125),_v(" "),_m(126),_v(" "),_m(127),_v(" "),_m(128),_v(" "),_m(129),_v(" "),_m(130),_v(" "),_m(131),_v(" "),_m(132),_v(" "),_m(133),_v(" "),_m(134),_v(" "),_m(135),_v(" "),_m(136),_v(" "),_m(137),_v(" "),_m(138),_v(" "),_m(139),_v(" "),_m(140),_v(" "),_m(141),_v(" "),_m(142),_v(" "),_m(143),_v(" "),_m(144),_v(" "),_m(145),_v(" "),_m(146),_v(" "),_m(147),_v(" "),_m(148),_v(" "),_m(149),_v(" "),_m(150),_v(" "),_m(151),_v(" "),_m(152),_v(" "),_m(153),_v(" "),_m(154),_v(" "),_m(155),_v(" "),_m(156),_v(" "),_m(157),_v(" "),_m(158),_v(" "),_m(159),_v(" "),_m(160),_v(" "),_m(161),_v(" "),_m(162),_v(" "),_m(163),_v(" "),_m(164),_v(" "),_m(165),_v(" "),_m(166),_v(" "),_m(167),_v(" "),_m(168),_v(" "),_m(169),_v(" "),_m(170),_v(" "),_m(171),_v(" "),_m(172),_v(" "),_m(173),_v(" "),_m(174),_v(" "),_m(175),_v(" "),_m(176),_v(" "),_m(177),_v(" "),_m(178),_v(" "),_m(179),_v(" "),_m(180),_v(" "),_m(181),_v(" "),_m(182),_v(" "),_m(183),_v(" "),_m(184),_v(" "),_m(185),_v(" "),_m(186),_v(" "),_m(187),_v(" "),_m(188),_v(" "),_m(189),_v(" "),_m(190),_v(" "),_c('hr'),_v(" "),_m(191),_v(" "),_c('p',[_v("Given below are instructions to test the app manually.")]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Note:")]),_v(" These instructions only provide a starting point for testers to work on;\ntesters are expected to do more "),_c('em',[_v("exploratory")]),_v(" testing.")])]),_v(" "),_m(192),_v(" "),_m(193),_v(" "),_m(194),_v(" "),_m(195),_v(" "),_m(196),_v(" "),_m(197),_v(" "),_m(198),_v(" "),_c('hr'),_v(" "),_m(199),_v(" "),_c('hr')],1),_v(" "),_c('overlay-source',{attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#clientcare"}},[_v("ClientCare")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#acknowledgements"}},[_v("Acknowledgements")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#setting-up-getting-started"}},[_v("Setting up, getting started")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#design"}},[_v("Design")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#architecture"}},[_v("Architecture")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#ui-component"}},[_v("UI component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#logic-component"}},[_v("Logic component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#model-component"}},[_v("Model component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#storage-component"}},[_v("Storage component")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#common-classes"}},[_v("Common classes")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#implementation"}},[_v("Implementation")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#view-client-feature"}},[_v("View Client feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#adding-notes-to-client-feature"}},[_v("Adding notes to client feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#sorting-clients-feature"}},[_v("Sorting clients feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#updating-last-met-feature"}},[_v("Updating last met feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#setting-last-met-overdue-duration-feature"}},[_v("Setting last met overdue duration feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#adding-schedule-feature"}},[_v("Adding schedule feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#marking-schedule-feature"}},[_v("Marking schedule feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#add-policy-feature"}},[_v("Add policy feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#deleting-policy-feature"}},[_v("Deleting policy feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#proposed-undo-redo-feature"}},[_v("[Proposed] Undo/redo feature")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#proposed-data-archiving"}},[_v("[Proposed] Data archiving")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#documentation-logging-testing-configuration-dev-ops"}},[_v("Documentation, logging, testing, configuration, dev-ops")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#appendix-requirements"}},[_v("Appendix: Requirements")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#product-scope"}},[_v("Product scope")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#user-stories"}},[_v("User stories")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#use-cases"}},[_v("Use cases")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#non-functional-requirements"}},[_v("Non-Functional Requirements")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#glossary"}},[_v("Glossary")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#appendix-instructions-for-manual-testing"}},[_v("Appendix: Instructions for manual testing")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#launch-and-shutdown"}},[_v("Launch and shutdown")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#deleting-a-person"}},[_v("Deleting a person")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#saving-data"}},[_v("Saving data")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#appendix-planned-enhancements"}},[_v("Appendix: Planned Enhancements")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#appendix-effort"}},[_v("Appendix: Effort")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(200)])} }; var pageVueStaticRenderFns = [function anonymous( ) { @@ -131,12 +131,36 @@ with(this){return _c('p',[_v("Classes used by multiple components are in the "), with(this){return _c('h2',{attrs:{"id":"implementation"}},[_c('strong',[_v("Implementation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#implementation","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('h3',{attrs:{"id":"updating-last-met-feature"}},[_v("Updating last met feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#updating-last-met-feature","onclick":"event.stopPropagation()"}})])} +with(this){return _c('h3',{attrs:{"id":"view-client-feature"}},[_v("View Client feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#view-client-feature","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('p',[_v("The view client feature allows users to view the details of a client using their "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("INDEX")]),_v(" on the GUI. This includes information not included in the client list cards, such as their last met and policy list.")])} },function anonymous( ) { with(this){return _c('h4',{attrs:{"id":"implementation-2"}},[_v("Implementation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#implementation-2","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { +with(this){return _c('p',[_v("The view client mechanism is facilitated by "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("DisplayClient")]),_v(" in the model. When any command referring to a client using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("INDEX")]),_v(" is executed, this DisplayClient is set to the client that was operated on (or cleared to "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("null")]),_v(" in the case of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clear")]),_v(").\nThis is done with the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("setDisplayClient()")]),_v(" function in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model")]),_v(", that is also implemented in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Logic")]),_v(".")])} +},function anonymous( +) { +with(this){return _c('p',[_v("The sequence diagram below shows the execution of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("view 1")]),_v(" to view the details of client at index 1.")])} +},function anonymous( +) { +with(this){return _c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("MainWindow")]),_v(" handles most of the UI logic in regard to displaying the viewed client on the GUI, including refreshing the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ClientDetailsPanel")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ClientPolicyTable")]),_v(". It also sets "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("DisplayClient")]),_v(" on startup when there is at least one client in the list.")])} +},function anonymous( +) { +with(this){return _c('h3',{attrs:{"id":"adding-notes-to-client-feature"}},[_v("Adding notes to client feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-notes-to-client-feature","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('h3',{attrs:{"id":"sorting-clients-feature"}},[_v("Sorting clients feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#sorting-clients-feature","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('h3',{attrs:{"id":"updating-last-met-feature"}},[_v("Updating last met feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#updating-last-met-feature","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('h4',{attrs:{"id":"implementation-3"}},[_v("Implementation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#implementation-3","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { with(this){return _c('p',[_v("The updating of last met command is facilitated by the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("LastMetCommandParser")]),_v(" class which is created by the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddressBookParser")]),_v(".")])} },function anonymous( ) { @@ -158,13 +182,22 @@ with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inl with(this){return _c('p',[_v("The method "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("LastMetCommand#execute()")]),_v(" returns a CommandResult object which contains the success message to be displayed to the user.")])} },function anonymous( ) { +with(this){return _c('h3',{attrs:{"id":"setting-last-met-overdue-duration-feature"}},[_v("Setting last met overdue duration feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#setting-last-met-overdue-duration-feature","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('h3',{attrs:{"id":"adding-schedule-feature"}},[_v("Adding schedule feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-schedule-feature","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('h3',{attrs:{"id":"marking-schedule-feature"}},[_v("Marking schedule feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#marking-schedule-feature","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { with(this){return _c('h3',{attrs:{"id":"add-policy-feature"}},[_v("Add policy feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#add-policy-feature","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { with(this){return _c('p',[_v("The add policy feature allows users to add a policy to a client. The policy is stored in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Policy")]),_v(" class, which contains the policy details such as policy name, policy id. The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Policy")]),_v(" class is then added to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("PolicyList")]),_v(" object stored within the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Person")]),_v(" object in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model")]),_v(" component.")])} },function anonymous( ) { -with(this){return _c('h4',{attrs:{"id":"implementation-3"}},[_v("Implementation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#implementation-3","onclick":"event.stopPropagation()"}})])} +with(this){return _c('h4',{attrs:{"id":"implementation-4"}},[_v("Implementation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#implementation-4","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { with(this){return _c('p',[_v("The add policy command mechanism is facilitated by the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddPolicyCommandParser")]),_v(" class which is created by the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddressBookParser")]),_v(".")])} @@ -191,22 +224,7 @@ with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inl with(this){return _c('p',[_v("The method "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AddPolicyCommand#execute()")]),_v(" returns a CommandResult object which contains the success message to be displayed to the user.")])} },function anonymous( ) { -with(this){return _c('h3',{attrs:{"id":"view-client-feature"}},[_v("View Client feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#view-client-feature","onclick":"event.stopPropagation()"}})])} -},function anonymous( -) { -with(this){return _c('p',[_v("The view client feature allows users to view the details of a client using their "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("INDEX")]),_v(" on the GUI. This includes information not included in the client list cards, such as their last met and policy list.")])} -},function anonymous( -) { -with(this){return _c('h4',{attrs:{"id":"implementation-4"}},[_v("Implementation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#implementation-4","onclick":"event.stopPropagation()"}})])} -},function anonymous( -) { -with(this){return _c('p',[_v("The view client mechanism is facilitated by "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("DisplayClient")]),_v(" in the model. When any command referring to a client using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("INDEX")]),_v(" is executed, this DisplayClient is set to the client that was operated on (or cleared to "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("null")]),_v(" in the case of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clear")]),_v(").\nThis is done with the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("setDisplayClient()")]),_v(" function in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Model")]),_v(", that is also implemented in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Logic")]),_v(".")])} -},function anonymous( -) { -with(this){return _c('p',[_v("The sequence diagram below shows the execution of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("view 1")]),_v(" to view the details of client at index 1.")])} -},function anonymous( -) { -with(this){return _c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("MainWindow")]),_v(" handles most of the UI logic in regard to displaying the viewed client on the GUI, including refreshing the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ClientDetailsPanel")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ClientPolicyTable")]),_v(". It also sets "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("DisplayClient")]),_v(" on startup when there is at least one client in the list.")])} +with(this){return _c('h3',{attrs:{"id":"deleting-policy-feature"}},[_v("Deleting policy feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#deleting-policy-feature","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { with(this){return _c('h3',{attrs:{"id":"proposed-undo-redo-feature"}},[_v("[Proposed] Undo/redo feature"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#proposed-undo-redo-feature","onclick":"event.stopPropagation()"}})])} @@ -311,7 +329,37 @@ with(this){return _c('h3',{attrs:{"id":"use-cases"}},[_v("Use cases"),_c('a',{st with(this){return _c('p',[_v("(For all use cases below, the "),_c('strong',[_v("System")]),_v(" is the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ClientCare")]),_v(" and the "),_c('strong',[_v("Actor")]),_v(" is the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("user")]),_v(", unless specified otherwise)")])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC01 - List all clients")])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC01 - Add new client")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("User requests to add new client.")]),_v(" "),_c('li',[_v("ClientCare adds the new client to the list.")]),_v(" "),_c('li',[_v("ClientCare shows a success message and "),_c('u',[_v("display view of new client details and policies (UC02)")]),_v("."),_c('br'),_v("\nUse case ends.")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("1a. ClientCare detects invalid user information.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare shows what is wrong with various invalid user information.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])]),_v(" "),_c('li',[_v("1b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])]),_v(" "),_c('li',[_v("1c. Client name already exists.\n"),_c('ul',[_c('li',[_v("1c1. ClientCare lets user know that duplicate names are not allowed.")]),_v(" "),_c('li',[_v("1c2. User enters new data."),_c('br'),_v("\nSteps 1c1-1c2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC02 - Delete client")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("User requests to "),_c('u',[_v("list all clients (UC01)")]),_v(" or "),_c('u',[_v("find client by name (UC04)")]),_v(".")]),_v(" "),_c('li',[_v("ClientCare shows a list of clients.")]),_v(" "),_c('li',[_v("User requests to delete a specific client in the list by index.")]),_v(" "),_c('li',[_v("ClientCare deletes the client."),_c('br'),_v("\nUse case ends.")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("2a. The list is empty."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("2a1. ClientCare lets user know that the list is empty."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("3a. The given index is invalid.\n"),_c('ul',[_c('li',[_v("3a1. ClientCare lets user know that client index should be a number.")]),_v(" "),_c('li',[_v("3a2. User enters new data."),_c('br'),_v("\nSteps 3a1-3a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes at step 2.")])])]),_v(" "),_c('li',[_v("3b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("3b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("3b2. User enters new data."),_c('br'),_v("\nSteps 3b1-3b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 4.")])])]),_v(" "),_c('li',[_v("3c. Client does not exist.\n"),_c('ul',[_c('li',[_v("3c1. ClientCare lets user know that client does not exist.")]),_v(" "),_c('li',[_v("3c2. User enters new data."),_c('br'),_v("\nSteps 3c1-3c2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC03 - Edit client")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} @@ -326,37 +374,37 @@ with(this){return _c('p',[_c('strong',[_v("Extensions")])])} with(this){return _c('ul',[_c('li',[_v("1a. The list is empty as no clients have been added at all.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that the list is empty."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])])])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC02 - View client details and policies")])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC04 - List all clients")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} },function anonymous( ) { -with(this){return _c('ol',[_c('li',[_v("User requests to view a client's details and policies.")]),_v(" "),_c('li',[_v("ClientCare shows that client's details and policies."),_c('br'),_v("\nUse case ends.")])])} +with(this){return _c('ol',[_c('li',[_v("User requests to view all clients.")]),_v(" "),_c('li',[_v("ClientCare shows a list of all clients."),_c('br'),_v("\nUse case ends.")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("Extensions")])])} },function anonymous( ) { -with(this){return _c('ul',[_c('li',[_v("1a. ClientCare detects that the client does not exist.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that client does not exist.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])])])} +with(this){return _c('ul',[_c('li',[_v("1a. The list is empty as no clients have been added at all.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that the list is empty."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])])])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC03 - Add a new client")])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC05 - View client details and policies")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} },function anonymous( ) { -with(this){return _c('ol',[_c('li',[_v("User requests to add new client.")]),_v(" "),_c('li',[_v("ClientCare adds the new client to the list.")]),_v(" "),_c('li',[_v("ClientCare shows a success message and "),_c('u',[_v("display view of new client details and policies (UC02)")]),_v("."),_c('br'),_v("\nUse case ends.")])])} +with(this){return _c('ol',[_c('li',[_v("User requests to view a client's details and policies.")]),_v(" "),_c('li',[_v("ClientCare shows that client's details and policies."),_c('br'),_v("\nUse case ends.")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("Extensions")])])} },function anonymous( ) { -with(this){return _c('ul',[_c('li',[_v("1a. ClientCare detects invalid user information.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare shows what is wrong with various invalid user information.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])]),_v(" "),_c('li',[_v("1b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])]),_v(" "),_c('li',[_v("1c. Client name already exists.\n"),_c('ul',[_c('li',[_v("1c1. ClientCare lets user know that duplicate names are not allowed.")]),_v(" "),_c('li',[_v("1c2. User enters new data."),_c('br'),_v("\nSteps 1c1-1c2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])])])} +with(this){return _c('ul',[_c('li',[_v("1a. ClientCare detects that the client does not exist.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that client does not exist.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])])])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC04 - Find a client by name")])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC06 - Find a client by name")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} @@ -371,22 +419,73 @@ with(this){return _c('p',[_c('strong',[_v("Extensions")])])} with(this){return _c('ul',[_c('li',[_v("2a. The list is empty as there is no matching name found."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("2a1. ClientCare lets user know that the list is empty."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("2b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("2b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("2b2. User enters new data."),_c('br'),_v("\nSteps 2b1-2b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 2.")])])])])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC05 - Delete a client")])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC07 - Adding remark to client")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} },function anonymous( ) { -with(this){return _c('ol',[_c('li',[_v("User requests to "),_c('u',[_v("list all clients (UC01)")]),_v(" or "),_c('u',[_v("find client by name (UC04)")]),_v(".")]),_v(" "),_c('li',[_v("ClientCare shows a list of clients.")]),_v(" "),_c('li',[_v("User requests to delete a specific client in the list by index.")]),_v(" "),_c('li',[_v("ClientCare deletes the client."),_c('br'),_v("\nUse case ends.")])])} +with(this){return _c('ol',[_c('li',[_v("PLACEHOLDER")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("Extensions")])])} },function anonymous( ) { -with(this){return _c('ul',[_c('li',[_v("2a. The list is empty."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("2a1. ClientCare lets user know that the list is empty."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("3a. The given index is invalid.\n"),_c('ul',[_c('li',[_v("3a1. ClientCare lets user know that client index should be a number.")]),_v(" "),_c('li',[_v("3a2. User enters new data."),_c('br'),_v("\nSteps 3a1-3a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes at step 2.")])])]),_v(" "),_c('li',[_v("3b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("3b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("3b2. User enters new data."),_c('br'),_v("\nSteps 3b1-3b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case resumes from step 4.")])])]),_v(" "),_c('li',[_v("3c. Client does not exist.\n"),_c('ul',[_c('li',[_v("3c1. ClientCare lets user know that client does not exist.")]),_v(" "),_c('li',[_v("3c2. User enters new data."),_c('br'),_v("\nSteps 3c1-3c2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC08 - Clear all client")])])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC06 - Schedule an appointment with client")])])} +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("PLACEHOLDER")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC09 - Sort clients")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("PLACEHOLDER")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC10 - Update client as met")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("User marks a client as met.")]),_v(" "),_c('li',[_v("ClientCare updates Last Met date of client."),_c('br'),_v("\nUse case ends.")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("1a. Client does not exist.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that client does not exist.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Invalid date format.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare lets user know of correct date and time format.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1c. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1c1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1c2. User enters new data."),_c('br'),_v("\nSteps 1d1-1d2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1d. Future date.\n"),_c('ul',[_c('li',[_v("1d1. ClientCare lets user know he cannot meet someone in the future.")]),_v(" "),_c('li',[_v("1d2. User enters new data."),_c('br'),_v("\nSteps 1d1-1d2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC11 - Update last met overdue duration")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("User enters the last met overdue duration to the new desired value.")]),_v(" "),_c('li',[_v("ClientCare updates the new last met overdue duration."),_c('br'),_v("\nUse case ends.")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("1a. The input entered is not a non-negative integer.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that the input is not accepted.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC12 - Schedule an appointment with client")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} @@ -401,37 +500,67 @@ with(this){return _c('p',[_c('strong',[_v("Extensions")])])} with(this){return _c('ul',[_c('li',[_v("1a. Date and time is invalid.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know of valid date and time format.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Date and time has past.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare lets user know that it is not possible to schedule an appointment in the past.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1c. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1c1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1c2. User enters new data."),_c('br'),_v("\nSteps 1c1-1c2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC07 - Update client as met")])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC13 - Mark appointment")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} },function anonymous( ) { -with(this){return _c('ol',[_c('li',[_v("User marks a client as met.")]),_v(" "),_c('li',[_v("ClientCare updates Last Met date of client."),_c('br'),_v("\nUse case ends.")])])} +with(this){return _c('ol',[_c('li',[_v("User marks an appointment with client as done.")]),_v(" "),_c('li',[_v("ClientCare updates appointment has done and updates last met."),_c('br'),_v("\nUse case ends.")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("Extensions")])])} },function anonymous( ) { -with(this){return _c('ul',[_c('li',[_v("1a. Client does not exist.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that client does not exist.")]),_v(" "),_c('li',[_v("1a2. User enters new data."),_c('br'),_v("\nSteps 1a1-1a2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. Invalid date and time.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare lets user know of correct date and time format.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1c. Date and time is before the last met date.\n"),_c('ul',[_c('li',[_v("1c1. ClientCare confirms if user wants to change last met to an earlier date.")]),_v(" "),_c('li',[_v("1c2. User confirms or rejects."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1d. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1d1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1d2. User enters new data."),_c('br'),_v("\nSteps 1d1-1d2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} +with(this){return _c('ul',[_c('li',[_v("1a. Appointment does not exist or is already marked.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that there is no open appointment for this client."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. The client does not exist.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows an error message.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1c. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1c1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1c2. User enters new data."),_c('br'),_v("\nSteps 1d1-1d2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} },function anonymous( ) { -with(this){return _c('p',[_c('strong',[_v("Use case: UC08 - Mark appointment")])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC14 - Add policies to client")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("MSS")])])} },function anonymous( ) { -with(this){return _c('ol',[_c('li',[_v("User marks an appointment with client as done.")]),_v(" "),_c('li',[_v("ClientCare updates appointment has done and updates last met."),_c('br'),_v("\nUse case ends.")])])} +with(this){return _c('ol',[_c('li',[_v("PLACEHOLDER")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")]),_v(" "),_c('em',[_v("{More to be added}")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC15 - Delete policies from client")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("PLACEHOLDER")])])} },function anonymous( ) { with(this){return _c('p',[_c('strong',[_v("Extensions")])])} },function anonymous( ) { -with(this){return _c('ul',[_c('li',[_v("1a. Appointment does not exist or is already marked.\n"),_c('ul',[_c('li',[_v("1a1. ClientCare lets user know that there is no open appointment for this client."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1b. The client does not exist.\n"),_c('ul',[_c('li',[_v("1b1. ClientCare shows an error message.")]),_v(" "),_c('li',[_v("1b2. User enters new data."),_c('br'),_v("\nSteps 1b1-1b2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1c. Appointment is in the future.\n"),_c('ul',[_c('li',[_v("1c1. ClientCare lets user know that future appointment cannot be marked.")]),_v(" "),_c('li',[_v("1c2. User enters new data."),_c('br'),_v("\nSteps 1c1-1c2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])]),_v(" "),_c('li',[_v("1d. Invalid command usage in the request.\n"),_c('ul',[_c('li',[_v("1d1. ClientCare shows command usage.")]),_v(" "),_c('li',[_v("1d2. User enters new data."),_c('br'),_v("\nSteps 1d1-1d2 are repeated until the data entered are correct."),_c('br'),_v("\nUse case ends.")])])])])} +with(this){return _c('p',[_c('strong',[_v("Use case: UC16 - Display help")])])} },function anonymous( ) { -with(this){return _c('p',[_c('em',[_v("{More to be added}")])])} +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("PLACEHOLDER")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Use case: UC17- Exit program")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("MSS")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("PLACEHOLDER")])])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Extensions")])])} },function anonymous( ) { with(this){return _c('h3',{attrs:{"id":"non-functional-requirements"}},[_v("Non-Functional Requirements"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#non-functional-requirements","onclick":"event.stopPropagation()"}})])} @@ -470,6 +599,12 @@ with(this){return _c('h3',{attrs:{"id":"saving-data"}},[_v("Saving data"),_c('a' with(this){return _c('ol',[_c('li',[_c('p',[_v("Dealing with missing/corrupted data files")]),_v(" "),_c('ol',[_c('li',[_c('em',[_v("{explain how to simulate a missing/corrupted file, and the expected behavior}")])])])]),_v(" "),_c('li',[_c('p',[_c('em',[_v("{ more test cases … }")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('h2',{attrs:{"id":"appendix-planned-enhancements"}},[_c('strong',[_v("Appendix: Planned Enhancements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#appendix-planned-enhancements","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('h2',{attrs:{"id":"appendix-effort"}},[_c('strong',[_v("Appendix: Effort")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#appendix-effort","onclick":"event.stopPropagation()"}})])} +},function anonymous( +) { +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/Documentation.html b/Documentation.html index 687041cab5e..fe325d7afbd 100644 --- a/Documentation.html +++ b/Documentation.html @@ -19,7 +19,7 @@ Search </div> <ul class="dropdown-menu search-dropdown-menu d-none dropdown-menu-end" data-v-cea1a814></ul></div></form></li></ul></div></nav> <div class="lower-navbar-container" style="display:none;" data-v-7c0fd418><!----> <!----></div></div></header> <div id="flex-body"><nav id="site-nav" data-v-e6005420><div class="site-nav-top" data-v-e6005420><div class="fw-bold mb-2" style="font-size:1.25rem;" data-v-e6005420>Site Map</div></div> <div class="nav-component slim-scroll" data-v-e6005420><div class="site-nav-root"><ul class="site-nav-list site-nav-list-root" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/index.html" data-v-e6005420>Home</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/UserGuide.html" data-v-e6005420>User Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#quick-start" data-v-e6005420>Quick Start</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#features" data-v-e6005420>Features</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>FAQ</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>Command Summary</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/DeveloperGuide.html" data-v-e6005420>Developer Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#acknowledgements" data-v-e6005420>Acknowledgements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#setting-up-getting-started" data-v-e6005420>Setting Up</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#design" data-v-e6005420>Design</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#implementation" data-v-e6005420>Implementation</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops" data-v-e6005420>Documentation, logging, testing, configuration, dev-ops</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-requirements" data-v-e6005420>Appendix: Requirements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-instructions-for-manual-testing" data-v-e6005420>Appendix: Instructions for manual testing</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420>Tutorials -<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="documentation-guide">Documentation Guide<a href="#documentation-guide" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <ul><li>We use <a href="https://markbind.org/"><strong>MarkBind</strong></a> to manage documentation.</li> <li>The <code class="hljs inline no-lang">docs/</code> folder contains the source files for the documentation website.</li> <li>To learn how set it up and maintain the project website, follow the guide <a href="https://se-education.org/guides/tutorials/markbind-forked-sites.html">[se-edu/guides] Working with Forked MarkBind sites</a> for project documentation.</li></ul> <p><strong>Style guidance:</strong></p> <ul><li>Follow the <a href="https://developers.google.com/style"><strong><em>Google developer documentation style guide</em></strong></a>.</li> <li>Also relevant is the <a href="https://se-education.org/guides/conventions/markdown.html"><em>se-edu/guides <strong>Markdown coding standard</strong></em></a>.</li></ul> <p><strong>Converting to PDF</strong></p> <ul><li>See the guide <a href="https://se-education.org/guides/tutorials/savingPdf.html"><em>se-edu/guides <strong>Saving web documents as PDF files</strong></em></a>.</li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#documentation-guide" data-v-e6005420>Documentation Guide</a> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="documentation-guide">Documentation Guide<a href="#documentation-guide" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <ul><li>We use <a href="https://markbind.org/"><strong>MarkBind</strong></a> to manage documentation.</li> <li>The <code class="hljs inline no-lang">docs/</code> folder contains the source files for the documentation website.</li> <li>To learn how set it up and maintain the project website, follow the guide <a href="https://se-education.org/guides/tutorials/markbind-forked-sites.html">[se-edu/guides] Working with Forked MarkBind sites</a> for project documentation.</li></ul> <p><strong>Style guidance:</strong></p> <ul><li>Follow the <a href="https://developers.google.com/style"><strong><em>Google developer documentation style guide</em></strong></a>.</li> <li>Also relevant is the <a href="https://se-education.org/guides/conventions/markdown.html"><em>se-edu/guides <strong>Markdown coding standard</strong></em></a>.</li></ul> <p><strong>Converting to PDF</strong></p> <ul><li>See the guide <a href="https://se-education.org/guides/tutorials/savingPdf.html"><em>se-edu/guides <strong>Saving web documents as PDF files</strong></em></a>.</li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#documentation-guide" data-v-e6005420>Documentation Guide</a> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/Documentation.page-vue-render.js b/Documentation.page-vue-render.js index 36b671d66e2..3d4fc843d71 100644 --- a/Documentation.page-vue-render.js +++ b/Documentation.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"documentation-guide"}},[_v("Documentation Guide"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-guide","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("We use "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_c('strong',[_v("MarkBind")])]),_v(" to manage documentation.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("docs/")]),_v(" folder contains the source files for the documentation website.")]),_v(" "),_c('li',[_v("To learn how set it up and maintain the project website, follow the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/markbind-forked-sites.html"}},[_v("[se-edu/guides] Working with Forked MarkBind sites")]),_v(" for project documentation.")])]),_v(" "),_c('p',[_c('strong',[_v("Style guidance:")])]),_v(" "),_c('ul',[_c('li',[_v("Follow the "),_c('a',{attrs:{"href":"https://developers.google.com/style"}},[_c('strong',[_c('em',[_v("Google developer documentation style guide")])])]),_v(".")]),_v(" "),_c('li',[_v("Also relevant is the "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/markdown.html"}},[_c('em',[_v("se-edu/guides "),_c('strong',[_v("Markdown coding standard")])])]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Converting to PDF")])]),_v(" "),_c('ul',[_c('li',[_v("See the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_c('em',[_v("se-edu/guides "),_c('strong',[_v("Saving web documents as PDF files")])])]),_v(".")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/Logging.html b/Logging.html index 7bdb63a1312..641c9fb102d 100644 --- a/Logging.html +++ b/Logging.html @@ -19,7 +19,7 @@ Search </div> <ul class="dropdown-menu search-dropdown-menu d-none dropdown-menu-end" data-v-cea1a814></ul></div></form></li></ul></div></nav> <div class="lower-navbar-container" style="display:none;" data-v-7c0fd418><!----> <!----></div></div></header> <div id="flex-body"><nav id="site-nav" data-v-e6005420><div class="site-nav-top" data-v-e6005420><div class="fw-bold mb-2" style="font-size:1.25rem;" data-v-e6005420>Site Map</div></div> <div class="nav-component slim-scroll" data-v-e6005420><div class="site-nav-root"><ul class="site-nav-list site-nav-list-root" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/index.html" data-v-e6005420>Home</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/UserGuide.html" data-v-e6005420>User Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#quick-start" data-v-e6005420>Quick Start</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#features" data-v-e6005420>Features</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>FAQ</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>Command Summary</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/DeveloperGuide.html" data-v-e6005420>Developer Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#acknowledgements" data-v-e6005420>Acknowledgements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#setting-up-getting-started" data-v-e6005420>Setting Up</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#design" data-v-e6005420>Design</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#implementation" data-v-e6005420>Implementation</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops" data-v-e6005420>Documentation, logging, testing, configuration, dev-ops</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-requirements" data-v-e6005420>Appendix: Requirements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-instructions-for-manual-testing" data-v-e6005420>Appendix: Instructions for manual testing</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420>Tutorials -<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="logging-guide">Logging guide<a href="#logging-guide" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <ul><li>We are using <code class="hljs inline no-lang">java.util.logging</code> package for logging.</li> <li>The <code class="hljs inline no-lang">LogsCenter</code> class is used to manage the logging levels and logging destinations.</li> <li>The <code class="hljs inline no-lang">Logger</code> for a class can be obtained using <code class="hljs inline no-lang">LogsCenter.getLogger(Class)</code> which will log messages according to the specified logging level.</li> <li>Log messages are output through the console and to a <code class="hljs inline no-lang">.log</code> file.</li> <li>The output logging level can be controlled using the <code class="hljs inline no-lang">logLevel</code> setting in the configuration file (See the <a href="/tp/Configuration.html">Configuration guide</a> section).</li> <li><strong>When choosing a level for a log message</strong>, follow the conventions given in <a href="https://se-education.org/guides/conventions/java/logging.html"><em>[se-edu/guides] Java: Logging conventions</em></a>.</li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="logging-guide">Logging guide<a href="#logging-guide" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <ul><li>We are using <code class="hljs inline no-lang">java.util.logging</code> package for logging.</li> <li>The <code class="hljs inline no-lang">LogsCenter</code> class is used to manage the logging levels and logging destinations.</li> <li>The <code class="hljs inline no-lang">Logger</code> for a class can be obtained using <code class="hljs inline no-lang">LogsCenter.getLogger(Class)</code> which will log messages according to the specified logging level.</li> <li>Log messages are output through the console and to a <code class="hljs inline no-lang">.log</code> file.</li> <li>The output logging level can be controlled using the <code class="hljs inline no-lang">logLevel</code> setting in the configuration file (See the <a href="/tp/Configuration.html">Configuration guide</a> section).</li> <li><strong>When choosing a level for a log message</strong>, follow the conventions given in <a href="https://se-education.org/guides/conventions/java/logging.html"><em>[se-edu/guides] Java: Logging conventions</em></a>.</li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/Logging.page-vue-render.js b/Logging.page-vue-render.js index 18d67e7cd52..df0278c8ac4 100644 --- a/Logging.page-vue-render.js +++ b/Logging.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"logging-guide"}},[_v("Logging guide"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#logging-guide","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("We are using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("java.util.logging")]),_v(" package for logging.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("LogsCenter")]),_v(" class is used to manage the logging levels and logging destinations.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Logger")]),_v(" for a class can be obtained using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("LogsCenter.getLogger(Class)")]),_v(" which will log messages according to the specified logging level.")]),_v(" "),_c('li',[_v("Log messages are output through the console and to a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".log")]),_v(" file.")]),_v(" "),_c('li',[_v("The output logging level can be controlled using the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("logLevel")]),_v(" setting in the configuration file (See the "),_c('a',{attrs:{"href":"/tp/Configuration.html"}},[_v("Configuration guide")]),_v(" section).")]),_v(" "),_c('li',[_c('strong',[_v("When choosing a level for a log message")]),_v(", follow the conventions given in "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/logging.html"}},[_c('em',[_v("[se-edu/guides] Java: Logging conventions")])]),_v(".")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/SettingUp.html b/SettingUp.html index f5583ffab87..3cd313a1066 100644 --- a/SettingUp.html +++ b/SettingUp.html @@ -25,7 +25,7 @@ </div> <!----></div></div></div></li> <li><strong>Verify the setup</strong>: <ol><li>Run the <code class="hljs inline no-lang">seedu.address.Main</code> and try a few commands.</li> <li><a href="/tp/Testing.html">Run the tests</a> to ensure they all pass.</li></ol></li></ol> <hr> <h2 id="before-writing-code">Before writing code<a href="#before-writing-code" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <ol><li><p><strong>Configure the coding style</strong></p> <p>If using IDEA, follow the guide <a href="https://se-education.org/guides/tutorials/intellijCodeStyle.html"><em>[se-edu/guides] IDEA: Configuring the code style</em></a> to set up IDEA's coding style to match ours.</p> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-success" data-v-0eabf1c4><i class="fas fa-lightbulb" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-success" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Tip:</strong> Optionally, you can follow the guide <a href="https://se-education.org/guides/tutorials/checkstyle.html" data-v-0eabf1c4><em data-v-0eabf1c4>[se-edu/guides] Using Checkstyle</em></a> to find how to use the CheckStyle within IDEA e.g., to report problems <em data-v-0eabf1c4>as</em> you write code.</p></div> <!----></div></div></div></li> <li><p><strong>Set up CI</strong></p> <p>This project comes with a GitHub Actions config files (in <code class="hljs inline no-lang">.github/workflows</code> folder). When GitHub detects those files, it will run the CI for your project automatically at each push to the <code class="hljs inline no-lang">master</code> branch or to any PR. No set up required.</p></li> <li><p><strong>Learn the design</strong></p> <p>When you are ready to start coding, we recommend that you get some sense of the overall design by reading about <a href="/tp/DeveloperGuide.html#architecture">AddressBook’s architecture</a>.</p></li> <li><p><strong>Do the tutorials</strong> -These tutorials will help you get acquainted with the codebase.</p> <ul><li><a href="/tp/tutorials/TracingCode.html">Tracing code</a></li> <li><a href="/tp/tutorials/AddRemark.html">Adding a new command</a></li> <li><a href="/tp/tutorials/RemovingFields.html">Removing fields</a></li></ul></li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#setting-up-and-getting-started" data-v-e6005420>Setting up and getting started</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#setting-up-the-project-in-your-computer" data-v-e6005420>Setting up the project in your computer</a> <a class="nav-link py-1" href="#before-writing-code" data-v-e6005420>Before writing code</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +These tutorials will help you get acquainted with the codebase.</p> <ul><li><a href="/tp/tutorials/TracingCode.html">Tracing code</a></li> <li><a href="/tp/tutorials/AddRemark.html">Adding a new command</a></li> <li><a href="/tp/tutorials/RemovingFields.html">Removing fields</a></li></ul></li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#setting-up-and-getting-started" data-v-e6005420>Setting up and getting started</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#setting-up-the-project-in-your-computer" data-v-e6005420>Setting up the project in your computer</a> <a class="nav-link py-1" href="#before-writing-code" data-v-e6005420>Before writing code</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/SettingUp.page-vue-render.js b/SettingUp.page-vue-render.js index bdfc1e30a7e..76ec39794d1 100644 --- a/SettingUp.page-vue-render.js +++ b/SettingUp.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('li',[_c('p',[_c('strong',[_v("Learn the design")])]),_v(" with(this){return _c('li',[_c('p',[_c('strong',[_v("Do the tutorials")]),_v("\nThese tutorials will help you get acquainted with the codebase.")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"/tp/tutorials/TracingCode.html"}},[_v("Tracing code")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"/tp/tutorials/AddRemark.html"}},[_v("Adding a new command")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"/tp/tutorials/RemovingFields.html"}},[_v("Removing fields")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/Testing.html b/Testing.html index 3714f5f87df..0810c51f95f 100644 --- a/Testing.html +++ b/Testing.html @@ -23,7 +23,7 @@ test class, or a test and choose <code class="hljs inline no-lang">Run 'ABC'</code></li></ul></li> <li><strong>Method 2: Using Gradle</strong> <ul><li>Open a console and run the command <code class="hljs inline no-lang">gradlew clean test</code> (Mac/Linux: <code class="hljs inline no-lang">./gradlew clean test</code>)</li></ul></li></ul> <div class="alert box-container seamless" data-v-0eabf1c4><!----> <div class="header-and-body" data-v-0eabf1c4><!----> <div class="box-body-wrapper" data-v-0eabf1c4><div class="icon-wrapper text-info" data-v-0eabf1c4><i class="fas fa-info" data-v-0eabf1c4></i></div> <div aria-hidden="true" class="vertical-divider alert-info" data-v-0eabf1c4></div> <div class="contents" data-v-0eabf1c4><p data-v-0eabf1c4><strong data-v-0eabf1c4>Link</strong>: Read <a href="https://se-education.org/guides/tutorials/gradle.html" data-v-0eabf1c4>this Gradle Tutorial from the se-edu/guides</a> to learn more about using Gradle.</p></div> <!----></div></div></div> <hr> <h2 id="types-of-tests">Types of tests<a href="#types-of-tests" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This project has three types of tests:</p> <ol><li><em>Unit tests</em> targeting the lowest level methods/classes.<br> e.g. <code class="hljs inline no-lang">seedu.address.commons.StringUtilTest</code></li> <li><em>Integration tests</em> that are checking the integration of multiple code units (those code units are assumed to be working).<br> e.g. <code class="hljs inline no-lang">seedu.address.storage.StorageManagerTest</code></li> <li>Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.<br> -e.g. <code class="hljs inline no-lang">seedu.address.logic.LogicManagerTest</code></li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#testing-guide" data-v-e6005420>Testing guide</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#running-tests" data-v-e6005420>Running tests</a> <a class="nav-link py-1" href="#types-of-tests" data-v-e6005420>Types of tests</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +e.g. <code class="hljs inline no-lang">seedu.address.logic.LogicManagerTest</code></li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#testing-guide" data-v-e6005420>Testing guide</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#running-tests" data-v-e6005420>Running tests</a> <a class="nav-link py-1" href="#types-of-tests" data-v-e6005420>Types of tests</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/Testing.page-vue-render.js b/Testing.page-vue-render.js index 56bbc88e9e1..5d9dcd9c2d6 100644 --- a/Testing.page-vue-render.js +++ b/Testing.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('h2',{attrs:{"id":"types-of-tests"}},[_v("Types of tests"), with(this){return _c('ol',[_c('li',[_c('em',[_v("Unit tests")]),_v(" targeting the lowest level methods/classes."),_c('br'),_v("\ne.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("seedu.address.commons.StringUtilTest")])]),_v(" "),_c('li',[_c('em',[_v("Integration tests")]),_v(" that are checking the integration of multiple code units (those code units are assumed to be working)."),_c('br'),_v("\ne.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("seedu.address.storage.StorageManagerTest")])]),_v(" "),_c('li',[_v("Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together."),_c('br'),_v("\ne.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("seedu.address.logic.LogicManagerTest")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/UserGuide.html b/UserGuide.html index e514599123d..bf8e5f6975a 100644 --- a/UserGuide.html +++ b/UserGuide.html @@ -110,7 +110,7 @@ the email was created from.</p> <p>For example: <a href="mailto:mike@gmail.com">mike@gmail.com</a></p> <p><code class="hljs inline no-lang">mike</code> will be the <code class="hljs inline no-lang">local-part</code> while <code class="hljs inline no-lang">gmail.com</code> will be the <code class="hljs inline no-lang">domain</code>.</p> <ol start="12"><li><strong>Not Cumulative</strong></li></ol> <p>This means that the new value added will not be added on top of the existing information. This is especially so for Tags. For example, if a Client currently has 2 tags <code class="hljs inline no-lang">friend</code> and <code class="hljs inline no-lang">important</code>, editing the tags with <code class="hljs inline no-lang">high</code> will override the previous 2 tags. The Client will only have the <code class="hljs inline no-lang">high</code> tag upon a success edit. To preserve all the tags, users must key in all previous tags in addition -to their new tag they wish to add.</p> <div style="page-break-after:always;"></div> <ol start="13"><li><strong>Last Met Overdue Period</strong></li></ol> <p>This refers to the number of days users can wait and not meet up with the Client before the Client shows up in the Last Met Display.</p> <p>The default period is 90 days. You can change this value using the <code class="hljs inline no-lang">set</code> command.</p> <ol start="14"><li><strong>Miscellaneous</strong></li></ol> <p>This refers to features or commands in ClientCare that are not related to Client, Schedules or Policies.</p> <ol start="15"><li><strong>Truncated</strong></li></ol> <p>If a text is truncated in the display, this means that the full text has been shortened, with an ellipsis <code class="hljs inline no-lang">...</code> at the end.</p> <div style="page-break-after:always;"></div> <h1 id="command-summary">Command summary<a href="#command-summary" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <div class="table-responsive"><table class="markbind-table table table-bordered table-striped"><thead><tr><th>Action</th> <th>Format, Examples</th></tr></thead> <tbody><tr><td><a href="#adding-a-client-add"><strong>Add</strong></a></td> <td><code class="hljs inline no-lang">add n/NAME c/PHONE_NUMBER e/EMAIL a/ADDRESS d/BIRTHDAY p/PRIORITY [t/TAG]…</code> <br> e.g.<code class="hljs inline no-lang">add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 d/1990-01-01 p/medium t/friend t/colleague</code></td></tr> <tr><td><a href="#deleting-a-client-delete"><strong>Delete</strong></a></td> <td><code class="hljs inline no-lang">delete INDEX</code><br> e.g. <code class="hljs inline no-lang">delete 3</code></td></tr> <tr><td><a href="#editing-a-client-edit"><strong>Edit</strong></a></td> <td><code class="hljs inline no-lang">edit INDEX [n/NAME] [c/PHONE] [e/EMAIL] [a/ADDRESS] [d/BIRTHDAY] [p/PRIORITY] [t/TAG]…</code><br> e.g.<code class="hljs inline no-lang">edit 2 n/James Lee e/jameslee@example.com</code></td></tr> <tr><td><a href="#listing-all-clients-list"><strong>List</strong></a></td> <td><code class="hljs inline no-lang">list</code></td></tr> <tr><td><a href="#viewing-a-client-view"><strong>View</strong></a></td> <td><code class="hljs inline no-lang">view INDEX</code><br> e.g, <code class="hljs inline no-lang">view 1</code></td></tr> <tr><td><a href="#finding-client-by-name-find"><strong>Find</strong></a></td> <td><code class="hljs inline no-lang">find KEYWORD [MORE_KEYWORDS]</code><br> e.g. <code class="hljs inline no-lang">find James Jake</code></td></tr> <tr><td><a href="#adding-notes-to-clients-remark"><strong>Remark</strong></a></td> <td><code class="hljs inline no-lang">remark INDEX [r/REMARK]</code><br> e.g. <code class="hljs inline no-lang">remark 3 r/Has 2 school-age children and 1 elderly dependent</code></td></tr> <tr><td><a href="#clearing-all-entries-clear"><strong>Clear</strong></a></td> <td><code class="hljs inline no-lang">clear</code></td></tr> <tr><td><a href="#sorting-the-client-list-sort"><strong>Sort</strong></a></td> <td><code class="hljs inline no-lang">sort CRITERIA o/ORDER</code> <br> e.g. <code class="hljs inline no-lang">sort priority o/desc</code></td></tr> <tr><td><a href="#updating-last-met-met"><strong>LastMet</strong></a></td> <td><code class="hljs inline no-lang">met INDEX d/DATE</code><br> e.g. <code class="hljs inline no-lang">met 2 d/2023-05-07</code></td></tr> <tr><td><a href="#setting-last-met-overdue-period-set"><strong>Set</strong></a></td> <td><code class="hljs inline no-lang">set NUMBER_OF_DAYS</code><br> e.g. <code class="hljs inline no-lang">set 5</code></td></tr> <tr><td><a href="#scheduling-appointments-schedule"><strong>Schedule</strong></a></td> <td><code class="hljs inline no-lang">schedule INDEX d/DATETIME</code><br> e.g. <code class="hljs inline no-lang">schedule 2 d/2023-05-07 22:00</code></td></tr> <tr><td><a href="#marking-appointments-mark"><strong>Mark</strong></a></td> <td><code class="hljs inline no-lang">mark INDEX</code><br> e.g. <code class="hljs inline no-lang">mark 2</code></td></tr> <tr><td><a href="#adding-a-policy-addpolicy"><strong>Add Policy</strong></a></td> <td><code class="hljs inline no-lang">addpolicy INDEX n/POLICY_NAME i/POLICY_ID</code> <br> e.g. <code class="hljs inline no-lang">addpolicy 1 n/Life i/1</code></td></tr> <tr><td><a href="#deleting-a-policy-deletepolicy"><strong>Delete Policy</strong></a></td> <td><code class="hljs inline no-lang">deletepolicy INDEX i/POLICY_ID</code> <br> e.g. <code class="hljs inline no-lang">deletepolicy 1 i/1</code></td></tr> <tr><td><a href="#viewing-help-help"><strong>Help</strong></a></td> <td><code class="hljs inline no-lang">help</code></td></tr> <tr><td><a href="#exiting-the-program-exit"><strong>Exit</strong></a></td> <td><code class="hljs inline no-lang">exit</code></td></tr></tbody></table></div></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><a class="navbar-brand page-nav-title" href="#" data-v-e6005420>Table of Contents</a> <nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#clientcare-user-guide" data-v-e6005420>ClientCare User Guide</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#table-of-contents" data-v-e6005420>Table of Contents</a> <a class="nav-link py-1" href="#using-this-guide" data-v-e6005420>Using this guide</a> <a class="nav-link py-1" href="#introducing-clientcare" data-v-e6005420>Introducing ClientCare</a></nav> <a class="nav-link py-1" href="#quick-start" data-v-e6005420>Quick start</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#installation-instructions" data-v-e6005420>Installation instructions</a> <a class="nav-link py-1" href="#starting-up-clientcare" data-v-e6005420>Starting up ClientCare</a> <a class="nav-link py-1" href="#getting-familiar-with-clientcare" data-v-e6005420>Getting familiar with ClientCare</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#clientcare-commands" data-v-e6005420>ClientCare Commands</a></nav> <a class="nav-link py-1" href="#quick-tutorial" data-v-e6005420>Quick Tutorial</a></nav> <a class="nav-link py-1" href="#features" data-v-e6005420>Features</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#client-related-commands" data-v-e6005420>Client related commands</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#adding-a-client-add" data-v-e6005420>Adding a client: add</a> <a class="nav-link py-1" href="#deleting-a-client-delete" data-v-e6005420>Deleting a client : delete</a> <a class="nav-link py-1" href="#editing-a-client-edit" data-v-e6005420>Editing a client : edit</a> <a class="nav-link py-1" href="#listing-all-clients-list" data-v-e6005420>Listing all clients : list</a> <a class="nav-link py-1" href="#viewing-a-client-view" data-v-e6005420>Viewing a client : view</a> <a class="nav-link py-1" href="#finding-client-by-name-find" data-v-e6005420>Finding client by name: find</a> <a class="nav-link py-1" href="#adding-notes-to-clients-remark" data-v-e6005420>Adding notes to clients: remark</a> <a class="nav-link py-1" href="#clearing-all-entries-clear" data-v-e6005420>Clearing all entries : clear</a> <a class="nav-link py-1" href="#sorting-the-client-list-sort" data-v-e6005420>Sorting the client list : sort</a></nav> <a class="nav-link py-1" href="#schedule-related-commands" data-v-e6005420>Schedule related commands</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#updating-last-met-met" data-v-e6005420>Updating last met : met</a> <a class="nav-link py-1" href="#setting-last-met-overdue-period-set" data-v-e6005420>Setting last met overdue period : set</a> <a class="nav-link py-1" href="#scheduling-appointments-schedule" data-v-e6005420>Scheduling appointments : schedule</a> <a class="nav-link py-1" href="#marking-appointments-mark" data-v-e6005420>Marking appointments : mark</a></nav> <a class="nav-link py-1" href="#policy-related-commands" data-v-e6005420>Policy related commands</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#adding-a-policy-addpolicy" data-v-e6005420>Adding a policy : addpolicy</a> <a class="nav-link py-1" href="#deleting-a-policy-deletepolicy" data-v-e6005420>Deleting a policy : deletepolicy</a></nav> <a class="nav-link py-1" href="#miscellaneous" data-v-e6005420>Miscellaneous</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#viewing-help-help" data-v-e6005420>Viewing help : help</a> <a class="nav-link py-1" href="#exiting-the-program-exit" data-v-e6005420>Exiting the program : exit</a> <a class="nav-link py-1" href="#saving-the-data" data-v-e6005420>Saving the data</a> <a class="nav-link py-1" href="#editing-the-data-file" data-v-e6005420>Editing the data file</a></nav></nav> <a class="nav-link py-1" href="#faq" data-v-e6005420>FAQ</a> <a class="nav-link py-1" href="#known-issues-and-troubleshooting" data-v-e6005420>Known issues and Troubleshooting</a> <a class="nav-link py-1" href="#glossary" data-v-e6005420>Glossary</a> <a class="nav-link py-1" href="#command-summary" data-v-e6005420>Command summary</a> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +to their new tag they wish to add.</p> <div style="page-break-after:always;"></div> <ol start="13"><li><strong>Last Met Overdue Period</strong></li></ol> <p>This refers to the number of days users can wait and not meet up with the Client before the Client shows up in the Last Met Display.</p> <p>The default period is 90 days. You can change this value using the <code class="hljs inline no-lang">set</code> command.</p> <ol start="14"><li><strong>Miscellaneous</strong></li></ol> <p>This refers to features or commands in ClientCare that are not related to Client, Schedules or Policies.</p> <ol start="15"><li><strong>Truncated</strong></li></ol> <p>If a text is truncated in the display, this means that the full text has been shortened, with an ellipsis <code class="hljs inline no-lang">...</code> at the end.</p> <div style="page-break-after:always;"></div> <h1 id="command-summary">Command summary<a href="#command-summary" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <div class="table-responsive"><table class="markbind-table table table-bordered table-striped"><thead><tr><th>Action</th> <th>Format, Examples</th></tr></thead> <tbody><tr><td><a href="#adding-a-client-add"><strong>Add</strong></a></td> <td><code class="hljs inline no-lang">add n/NAME c/PHONE_NUMBER e/EMAIL a/ADDRESS d/BIRTHDAY p/PRIORITY [t/TAG]…</code> <br> e.g.<code class="hljs inline no-lang">add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 d/1990-01-01 p/medium t/friend t/colleague</code></td></tr> <tr><td><a href="#deleting-a-client-delete"><strong>Delete</strong></a></td> <td><code class="hljs inline no-lang">delete INDEX</code><br> e.g. <code class="hljs inline no-lang">delete 3</code></td></tr> <tr><td><a href="#editing-a-client-edit"><strong>Edit</strong></a></td> <td><code class="hljs inline no-lang">edit INDEX [n/NAME] [c/PHONE] [e/EMAIL] [a/ADDRESS] [d/BIRTHDAY] [p/PRIORITY] [t/TAG]…</code><br> e.g.<code class="hljs inline no-lang">edit 2 n/James Lee e/jameslee@example.com</code></td></tr> <tr><td><a href="#listing-all-clients-list"><strong>List</strong></a></td> <td><code class="hljs inline no-lang">list</code></td></tr> <tr><td><a href="#viewing-a-client-view"><strong>View</strong></a></td> <td><code class="hljs inline no-lang">view INDEX</code><br> e.g, <code class="hljs inline no-lang">view 1</code></td></tr> <tr><td><a href="#finding-client-by-name-find"><strong>Find</strong></a></td> <td><code class="hljs inline no-lang">find KEYWORD [MORE_KEYWORDS]</code><br> e.g. <code class="hljs inline no-lang">find James Jake</code></td></tr> <tr><td><a href="#adding-notes-to-clients-remark"><strong>Remark</strong></a></td> <td><code class="hljs inline no-lang">remark INDEX [r/REMARK]</code><br> e.g. <code class="hljs inline no-lang">remark 3 r/Has 2 school-age children and 1 elderly dependent</code></td></tr> <tr><td><a href="#clearing-all-entries-clear"><strong>Clear</strong></a></td> <td><code class="hljs inline no-lang">clear</code></td></tr> <tr><td><a href="#sorting-the-client-list-sort"><strong>Sort</strong></a></td> <td><code class="hljs inline no-lang">sort CRITERIA o/ORDER</code> <br> e.g. <code class="hljs inline no-lang">sort priority o/desc</code></td></tr> <tr><td><a href="#updating-last-met-met"><strong>LastMet</strong></a></td> <td><code class="hljs inline no-lang">met INDEX d/DATE</code><br> e.g. <code class="hljs inline no-lang">met 2 d/2023-05-07</code></td></tr> <tr><td><a href="#setting-last-met-overdue-period-set"><strong>Set</strong></a></td> <td><code class="hljs inline no-lang">set NUMBER_OF_DAYS</code><br> e.g. <code class="hljs inline no-lang">set 5</code></td></tr> <tr><td><a href="#scheduling-appointments-schedule"><strong>Schedule</strong></a></td> <td><code class="hljs inline no-lang">schedule INDEX d/DATETIME</code><br> e.g. <code class="hljs inline no-lang">schedule 2 d/2023-05-07 22:00</code></td></tr> <tr><td><a href="#marking-appointments-mark"><strong>Mark</strong></a></td> <td><code class="hljs inline no-lang">mark INDEX</code><br> e.g. <code class="hljs inline no-lang">mark 2</code></td></tr> <tr><td><a href="#adding-a-policy-addpolicy"><strong>Add Policy</strong></a></td> <td><code class="hljs inline no-lang">addpolicy INDEX n/POLICY_NAME i/POLICY_ID</code> <br> e.g. <code class="hljs inline no-lang">addpolicy 1 n/Life i/1</code></td></tr> <tr><td><a href="#deleting-a-policy-deletepolicy"><strong>Delete Policy</strong></a></td> <td><code class="hljs inline no-lang">deletepolicy INDEX i/POLICY_ID</code> <br> e.g. <code class="hljs inline no-lang">deletepolicy 1 i/1</code></td></tr> <tr><td><a href="#viewing-help-help"><strong>Help</strong></a></td> <td><code class="hljs inline no-lang">help</code></td></tr> <tr><td><a href="#exiting-the-program-exit"><strong>Exit</strong></a></td> <td><code class="hljs inline no-lang">exit</code></td></tr></tbody></table></div></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><a class="navbar-brand page-nav-title" href="#" data-v-e6005420>Table of Contents</a> <nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#clientcare-user-guide" data-v-e6005420>ClientCare User Guide</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#table-of-contents" data-v-e6005420>Table of Contents</a> <a class="nav-link py-1" href="#using-this-guide" data-v-e6005420>Using this guide</a> <a class="nav-link py-1" href="#introducing-clientcare" data-v-e6005420>Introducing ClientCare</a></nav> <a class="nav-link py-1" href="#quick-start" data-v-e6005420>Quick start</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#installation-instructions" data-v-e6005420>Installation instructions</a> <a class="nav-link py-1" href="#starting-up-clientcare" data-v-e6005420>Starting up ClientCare</a> <a class="nav-link py-1" href="#getting-familiar-with-clientcare" data-v-e6005420>Getting familiar with ClientCare</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#clientcare-commands" data-v-e6005420>ClientCare Commands</a></nav> <a class="nav-link py-1" href="#quick-tutorial" data-v-e6005420>Quick Tutorial</a></nav> <a class="nav-link py-1" href="#features" data-v-e6005420>Features</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#client-related-commands" data-v-e6005420>Client related commands</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#adding-a-client-add" data-v-e6005420>Adding a client: add</a> <a class="nav-link py-1" href="#deleting-a-client-delete" data-v-e6005420>Deleting a client : delete</a> <a class="nav-link py-1" href="#editing-a-client-edit" data-v-e6005420>Editing a client : edit</a> <a class="nav-link py-1" href="#listing-all-clients-list" data-v-e6005420>Listing all clients : list</a> <a class="nav-link py-1" href="#viewing-a-client-view" data-v-e6005420>Viewing a client : view</a> <a class="nav-link py-1" href="#finding-client-by-name-find" data-v-e6005420>Finding client by name: find</a> <a class="nav-link py-1" href="#adding-notes-to-clients-remark" data-v-e6005420>Adding notes to clients: remark</a> <a class="nav-link py-1" href="#clearing-all-entries-clear" data-v-e6005420>Clearing all entries : clear</a> <a class="nav-link py-1" href="#sorting-the-client-list-sort" data-v-e6005420>Sorting the client list : sort</a></nav> <a class="nav-link py-1" href="#schedule-related-commands" data-v-e6005420>Schedule related commands</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#updating-last-met-met" data-v-e6005420>Updating last met : met</a> <a class="nav-link py-1" href="#setting-last-met-overdue-period-set" data-v-e6005420>Setting last met overdue period : set</a> <a class="nav-link py-1" href="#scheduling-appointments-schedule" data-v-e6005420>Scheduling appointments : schedule</a> <a class="nav-link py-1" href="#marking-appointments-mark" data-v-e6005420>Marking appointments : mark</a></nav> <a class="nav-link py-1" href="#policy-related-commands" data-v-e6005420>Policy related commands</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#adding-a-policy-addpolicy" data-v-e6005420>Adding a policy : addpolicy</a> <a class="nav-link py-1" href="#deleting-a-policy-deletepolicy" data-v-e6005420>Deleting a policy : deletepolicy</a></nav> <a class="nav-link py-1" href="#miscellaneous" data-v-e6005420>Miscellaneous</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#viewing-help-help" data-v-e6005420>Viewing help : help</a> <a class="nav-link py-1" href="#exiting-the-program-exit" data-v-e6005420>Exiting the program : exit</a> <a class="nav-link py-1" href="#saving-the-data" data-v-e6005420>Saving the data</a> <a class="nav-link py-1" href="#editing-the-data-file" data-v-e6005420>Editing the data file</a></nav></nav> <a class="nav-link py-1" href="#faq" data-v-e6005420>FAQ</a> <a class="nav-link py-1" href="#known-issues-and-troubleshooting" data-v-e6005420>Known issues and Troubleshooting</a> <a class="nav-link py-1" href="#glossary" data-v-e6005420>Glossary</a> <a class="nav-link py-1" href="#command-summary" data-v-e6005420>Command summary</a> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/UserGuide.page-vue-render.js b/UserGuide.page-vue-render.js index 2a3b7841f60..79ac159ceaf 100644 --- a/UserGuide.page-vue-render.js +++ b/UserGuide.page-vue-render.js @@ -905,6 +905,6 @@ with(this){return _c('h1',{attrs:{"id":"command-summary"}},[_v("Command summary" with(this){return _c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Action")]),_v(" "),_c('th',[_v("Format, Examples")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('a',{attrs:{"href":"#adding-a-client-add"}},[_c('strong',[_v("Add")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("add n/NAME c/PHONE_NUMBER e/EMAIL a/ADDRESS d/BIRTHDAY p/PRIORITY [t/TAG]…")]),_v(" "),_c('br'),_v(" e.g."),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 d/1990-01-01 p/medium t/friend t/colleague")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#deleting-a-client-delete"}},[_c('strong',[_v("Delete")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete INDEX")]),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete 3")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#editing-a-client-edit"}},[_c('strong',[_v("Edit")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("edit INDEX [n/NAME] [c/PHONE] [e/EMAIL] [a/ADDRESS] [d/BIRTHDAY] [p/PRIORITY] [t/TAG]…")]),_c('br'),_v(" e.g."),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("edit 2 n/James Lee e/jameslee@example.com")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#listing-all-clients-list"}},[_c('strong',[_v("List")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("list")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#viewing-a-client-view"}},[_c('strong',[_v("View")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("view INDEX")]),_c('br'),_v(" e.g, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("view 1")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#finding-client-by-name-find"}},[_c('strong',[_v("Find")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("find KEYWORD [MORE_KEYWORDS]")]),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("find James Jake")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#adding-notes-to-clients-remark"}},[_c('strong',[_v("Remark")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("remark INDEX [r/REMARK]")]),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("remark 3 r/Has 2 school-age children and 1 elderly dependent")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#clearing-all-entries-clear"}},[_c('strong',[_v("Clear")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clear")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#sorting-the-client-list-sort"}},[_c('strong',[_v("Sort")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("sort CRITERIA o/ORDER")]),_v(" "),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("sort priority o/desc")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#updating-last-met-met"}},[_c('strong',[_v("LastMet")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("met INDEX d/DATE")]),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("met 2 d/2023-05-07")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#setting-last-met-overdue-period-set"}},[_c('strong',[_v("Set")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("set NUMBER_OF_DAYS")]),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("set 5")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#scheduling-appointments-schedule"}},[_c('strong',[_v("Schedule")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("schedule INDEX d/DATETIME")]),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("schedule 2 d/2023-05-07 22:00")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#marking-appointments-mark"}},[_c('strong',[_v("Mark")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("mark INDEX")]),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("mark 2")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#adding-a-policy-addpolicy"}},[_c('strong',[_v("Add Policy")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("addpolicy INDEX n/POLICY_NAME i/POLICY_ID")]),_v(" "),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("addpolicy 1 n/Life i/1")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#deleting-a-policy-deletepolicy"}},[_c('strong',[_v("Delete Policy")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("deletepolicy INDEX i/POLICY_ID")]),_v(" "),_c('br'),_v(" e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("deletepolicy 1 i/1")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#viewing-help-help"}},[_c('strong',[_v("Help")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("help")])])]),_v(" "),_c('tr',[_c('td',[_c('a',{attrs:{"href":"#exiting-the-program-exit"}},[_c('strong',[_v("Exit")])])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("exit")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/index.html b/index.html index 08ddd3f72e7..d42d43f83c4 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,7 @@ Search </div> <ul class="dropdown-menu search-dropdown-menu d-none dropdown-menu-end" data-v-cea1a814></ul></div></form></li></ul></div></nav> <div class="lower-navbar-container" style="display:none;" data-v-7c0fd418><!----> <!----></div></div></header> <div id="flex-body"><nav id="site-nav" data-v-e6005420><div class="site-nav-top" data-v-e6005420><div class="fw-bold mb-2" style="font-size:1.25rem;" data-v-e6005420>Site Map</div></div> <div class="nav-component slim-scroll" data-v-e6005420><div class="site-nav-root"><ul class="site-nav-list site-nav-list-root" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/index.html" data-v-e6005420>Home</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/UserGuide.html" data-v-e6005420>User Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#quick-start" data-v-e6005420>Quick Start</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#features" data-v-e6005420>Features</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>FAQ</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/UserGuide.html#faq" data-v-e6005420>Command Summary</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/DeveloperGuide.html" data-v-e6005420>Developer Guide</a> <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon site-nav-rotate-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#acknowledgements" data-v-e6005420>Acknowledgements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#setting-up-getting-started" data-v-e6005420>Setting Up</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#design" data-v-e6005420>Design</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#implementation" data-v-e6005420>Implementation</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops" data-v-e6005420>Documentation, logging, testing, configuration, dev-ops</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-requirements" data-v-e6005420>Appendix: Requirements</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/DeveloperGuide.html#appendix-instructions-for-manual-testing" data-v-e6005420>Appendix: Instructions for manual testing</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420>Tutorials -<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="clientcare">ClientCare<a href="#clientcare" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <p><a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/actions"><img src="https://github.com/AY2324S2-CS2103T-W12-1/tp/workflows/Java%20CI/badge.svg" alt="CI Status" class="img-fluid"></a> <a href="https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp"><img src="https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp/graph/badge.svg?token=SFY0S3364D" alt="codecov" class="img-fluid"></a></p> <p><a href="/tp/images/Ui.png" target="_self"><img src="/tp/images/Ui.png" alt="Ui" class="img-fluid"></a></p> <p><strong>ClientCare is a desktop application for assisting insurance agents in managing their client relationships and follow-ups effectively.</strong> While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).</p> <ul><li>If you are interested in using ClientCare, head over to the <a href="/tp/UserGuide.html#quick-start"><em>Quick Start</em> section of the <strong>User Guide</strong></a>.</li> <li>If you are interested about developing ClientCare, the <a href="/tp/DeveloperGuide.html"><strong>Developer Guide</strong></a> is a good place to start.</li></ul> <p><strong>Acknowledgements</strong></p> <ul><li>Libraries used: <a href="https://openjfx.io/">JavaFX</a>, <a href="https://github.com/FasterXML/jackson">Jackson</a>, <a href="https://github.com/junit-team/junit5">JUnit5</a></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h1 id="clientcare">ClientCare<a href="#clientcare" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h1> <p><a href="https://github.com/AY2324S2-CS2103T-W12-1/tp/actions"><img src="https://github.com/AY2324S2-CS2103T-W12-1/tp/workflows/Java%20CI/badge.svg" alt="CI Status" class="img-fluid"></a> <a href="https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp"><img src="https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp/graph/badge.svg?token=SFY0S3364D" alt="codecov" class="img-fluid"></a></p> <p><a href="/tp/images/Ui.png" target="_self"><img src="/tp/images/Ui.png" alt="Ui" class="img-fluid"></a></p> <p><strong>ClientCare is a desktop application for assisting insurance agents in managing their client relationships and follow-ups effectively.</strong> While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).</p> <ul><li>If you are interested in using ClientCare, head over to the <a href="/tp/UserGuide.html#quick-start"><em>Quick Start</em> section of the <strong>User Guide</strong></a>.</li> <li>If you are interested about developing ClientCare, the <a href="/tp/DeveloperGuide.html"><strong>Developer Guide</strong></a> is a good place to start.</li></ul> <p><strong>Acknowledgements</strong></p> <ul><li>Libraries used: <a href="https://openjfx.io/">JavaFX</a>, <a href="https://github.com/FasterXML/jackson">Jackson</a>, <a href="https://github.com/junit-team/junit5">JUnit5</a></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/index.page-vue-render.js b/index.page-vue-render.js index d3f741bd124..d0c756a218f 100644 --- a/index.page-vue-render.js +++ b/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"clientcare"}},[_v("ClientCare"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#clientcare","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://github.com/AY2324S2-CS2103T-W12-1/tp/actions"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://github.com/AY2324S2-CS2103T-W12-1/tp/workflows/Java%20CI/badge.svg","alt":"CI Status"}})]),_v(" "),_c('a',{attrs:{"href":"https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://codecov.io/gh/AY2324S2-CS2103T-W12-1/tp/graph/badge.svg?token=SFY0S3364D","alt":"codecov"}})])]),_v(" "),_c('p',[_c('a',{attrs:{"href":"/tp/images/Ui.png","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"/tp/images/Ui.png","alt":"Ui"}})])]),_v(" "),_c('p',[_c('strong',[_v("ClientCare is a desktop application for assisting insurance agents in managing their client relationships and follow-ups effectively.")]),_v(" While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).")]),_v(" "),_c('ul',[_c('li',[_v("If you are interested in using ClientCare, head over to the "),_c('a',{attrs:{"href":"/tp/UserGuide.html#quick-start"}},[_c('em',[_v("Quick Start")]),_v(" section of the "),_c('strong',[_v("User Guide")])]),_v(".")]),_v(" "),_c('li',[_v("If you are interested about developing ClientCare, the "),_c('a',{attrs:{"href":"/tp/DeveloperGuide.html"}},[_c('strong',[_v("Developer Guide")])]),_v(" is a good place to start.")])]),_v(" "),_c('p',[_c('strong',[_v("Acknowledgements")])]),_v(" "),_c('ul',[_c('li',[_v("Libraries used: "),_c('a',{attrs:{"href":"https://openjfx.io/"}},[_v("JavaFX")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/FasterXML/jackson"}},[_v("Jackson")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/junit-team/junit5"}},[_v("JUnit5")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/siteData.json b/siteData.json index c282e5b71be..0e66069d6f5 100644 --- a/siteData.json +++ b/siteData.json @@ -50,9 +50,15 @@ "storage-component": "Storage component", "common-classes": "Common classes", "implementation": "Implementation", + "view-client-feature": "View Client feature", + "adding-notes-to-client-feature": "Adding notes to client feature", + "sorting-clients-feature": "Sorting clients feature", "updating-last-met-feature": "Updating last met feature", + "setting-last-met-overdue-duration-feature": "Setting last met overdue duration feature", + "adding-schedule-feature": "Adding schedule feature", + "marking-schedule-feature": "Marking schedule feature", "add-policy-feature": "Add policy feature", - "view-client-feature": "View Client feature", + "deleting-policy-feature": "Deleting policy feature", "proposed-undo-redo-feature": "[Proposed] Undo/redo feature", "proposed-data-archiving": "[Proposed] Data archiving", "documentation-logging-testing-configuration-dev-ops": "Documentation, logging, testing, configuration, dev-ops", @@ -65,7 +71,9 @@ "appendix-instructions-for-manual-testing": "Appendix: Instructions for manual testing", "launch-and-shutdown": "Launch and shutdown", "deleting-a-person": "Deleting a person", - "saving-data": "Saving data" + "saving-data": "Saving data", + "appendix-planned-enhancements": "Appendix: Planned Enhancements", + "appendix-effort": "Appendix: Effort" }, "headingKeywords": {} }, diff --git a/team/reganchoy.html b/team/reganchoy.html index 7e272f0c4cd..9d67ad992a1 100644 --- a/team/reganchoy.html +++ b/team/reganchoy.html @@ -21,7 +21,7 @@ <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h3 id="project-clientcare">Project: ClientCare<a href="#project-clientcare" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>Given below are my contributions to the project.</p> <ul><li><p><strong>New Feature</strong>: Added the ability to undo/redo previous commands.</p> <ul><li>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.</li> <li>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.</li> <li>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.</li> <li>Credits: <em>{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}</em></li></ul></li> <li><p><strong>New Feature</strong>: Added a history command that allows the user to navigate to previous commands using up/down keys.</p></li> <li><p><strong>Code contributed</strong>: <a href="">RepoSense link</a></p></li> <li><p><strong>Project management</strong>:</p> <ul><li>Managed releases <code class="hljs inline no-lang">v1.3</code> - <code class="hljs inline no-lang">v1.5rc</code> (3 releases) on GitHub</li></ul></li> <li><p><strong>Enhancements to existing features</strong>:</p> <ul><li>Updated the GUI color scheme (Pull requests <a href="">#33</a>, <a href="">#34</a>)</li> <li>Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests <a href="">#36</a>, <a href="">#38</a>)</li></ul></li> <li><p><strong>Documentation</strong>:</p> <ul><li>User Guide: <ul><li>Added documentation for the features <code class="hljs inline no-lang">delete</code> and <code class="hljs inline no-lang">find</code> <a href="">#72</a></li> <li>Did cosmetic tweaks to existing documentation of features <code class="hljs inline no-lang">clear</code>, <code class="hljs inline no-lang">exit</code>: <a href="">#74</a></li></ul></li> <li>Developer Guide: -<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/team/reganchoy.page-vue-render.js b/team/reganchoy.page-vue-render.js index 37f667744ca..e32b73578ff 100644 --- a/team/reganchoy.page-vue-render.js +++ b/team/reganchoy.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h3',{attrs:{"id":"project-clientcare"}},[_v("Project: ClientCare"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-clientcare","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("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.")]),_v(" "),_c('p',[_v("Given below are my contributions to the project.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added the ability to undo/redo previous commands.")]),_v(" "),_c('ul',[_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("Credits: "),_c('em',[_v("{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}")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added a history command that allows the user to navigate to previous commands using up/down keys.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code contributed")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("RepoSense link")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Project management")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Managed releases "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.3")]),_v(" - "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.5rc")]),_v(" (3 releases) on GitHub")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Enhancements to existing features")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Updated the GUI color scheme (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#33")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#34")]),_v(")")]),_v(" "),_c('li',[_v("Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#36")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#38")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Documentation")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("User Guide:\n"),_c('ul',[_c('li',[_v("Added documentation for the features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("find")]),_v(" "),_c('a',{attrs:{"href":""}},[_v("#72")])]),_v(" "),_c('li',[_v("Did cosmetic tweaks to existing documentation of features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clear")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("exit")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("#74")])])])]),_v(" "),_c('li',[_v("Developer Guide:\n"),_c('ul',[_c('li',[_v("Added implementation details of the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" feature.")])])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Community")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("PRs reviewed (with non-trivial review comments): "),_c('a',{attrs:{"href":""}},[_v("#12")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#32")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#19")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#42")])]),_v(" "),_c('li',[_v("Contributed to forum discussions (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("4")]),_v(")")]),_v(" "),_c('li',[_v("Reported bugs and suggestions for other teams in the class (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(")")]),_v(" "),_c('li',[_v("Some parts of the history feature I added was adopted by several other class mates ("),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Tools")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Integrated a third party library (Natty) to the project ("),_c('a',{attrs:{"href":""}},[_v("#42")]),_v(")")]),_v(" "),_c('li',[_v("Integrated a new Github plugin (CircleCI) to the team repo")])])]),_v(" "),_c('li',[_c('p',[_c('em',[_v("{you can add/remove categories in the list above}")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/team/shuqing.html b/team/shuqing.html index 611bf016ad9..ed9816e62d2 100644 --- a/team/shuqing.html +++ b/team/shuqing.html @@ -21,7 +21,7 @@ <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h3 id="project-clientcare">Project: ClientCare<a href="#project-clientcare" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>Given below are my contributions to the project.</p> <ul><li><p><strong>New Feature</strong>: Added the ability to undo/redo previous commands.</p> <ul><li>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.</li> <li>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.</li> <li>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.</li> <li>Credits: <em>{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}</em></li></ul></li> <li><p><strong>New Feature</strong>: Added a history command that allows the user to navigate to previous commands using up/down keys.</p></li> <li><p><strong>Code contributed</strong>: <a href="">RepoSense link</a></p></li> <li><p><strong>Project management</strong>:</p> <ul><li>Managed releases <code class="hljs inline no-lang">v1.3</code> - <code class="hljs inline no-lang">v1.5rc</code> (3 releases) on GitHub</li></ul></li> <li><p><strong>Enhancements to existing features</strong>:</p> <ul><li>Updated the GUI color scheme (Pull requests <a href="">#33</a>, <a href="">#34</a>)</li> <li>Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests <a href="">#36</a>, <a href="">#38</a>)</li></ul></li> <li><p><strong>Documentation</strong>:</p> <ul><li>User Guide: <ul><li>Added documentation for the features <code class="hljs inline no-lang">delete</code> and <code class="hljs inline no-lang">find</code> <a href="">#72</a></li> <li>Did cosmetic tweaks to existing documentation of features <code class="hljs inline no-lang">clear</code>, <code class="hljs inline no-lang">exit</code>: <a href="">#74</a></li></ul></li> <li>Developer Guide: -<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/team/shuqing.page-vue-render.js b/team/shuqing.page-vue-render.js index 37f667744ca..e32b73578ff 100644 --- a/team/shuqing.page-vue-render.js +++ b/team/shuqing.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h3',{attrs:{"id":"project-clientcare"}},[_v("Project: ClientCare"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-clientcare","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("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.")]),_v(" "),_c('p',[_v("Given below are my contributions to the project.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added the ability to undo/redo previous commands.")]),_v(" "),_c('ul',[_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("Credits: "),_c('em',[_v("{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}")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added a history command that allows the user to navigate to previous commands using up/down keys.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code contributed")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("RepoSense link")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Project management")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Managed releases "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.3")]),_v(" - "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.5rc")]),_v(" (3 releases) on GitHub")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Enhancements to existing features")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Updated the GUI color scheme (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#33")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#34")]),_v(")")]),_v(" "),_c('li',[_v("Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#36")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#38")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Documentation")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("User Guide:\n"),_c('ul',[_c('li',[_v("Added documentation for the features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("find")]),_v(" "),_c('a',{attrs:{"href":""}},[_v("#72")])]),_v(" "),_c('li',[_v("Did cosmetic tweaks to existing documentation of features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clear")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("exit")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("#74")])])])]),_v(" "),_c('li',[_v("Developer Guide:\n"),_c('ul',[_c('li',[_v("Added implementation details of the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" feature.")])])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Community")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("PRs reviewed (with non-trivial review comments): "),_c('a',{attrs:{"href":""}},[_v("#12")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#32")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#19")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#42")])]),_v(" "),_c('li',[_v("Contributed to forum discussions (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("4")]),_v(")")]),_v(" "),_c('li',[_v("Reported bugs and suggestions for other teams in the class (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(")")]),_v(" "),_c('li',[_v("Some parts of the history feature I added was adopted by several other class mates ("),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Tools")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Integrated a third party library (Natty) to the project ("),_c('a',{attrs:{"href":""}},[_v("#42")]),_v(")")]),_v(" "),_c('li',[_v("Integrated a new Github plugin (CircleCI) to the team repo")])])]),_v(" "),_c('li',[_c('p',[_c('em',[_v("{you can add/remove categories in the list above}")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/team/solomonng.html b/team/solomonng.html index 617e98dc8e7..8fb74868f5e 100644 --- a/team/solomonng.html +++ b/team/solomonng.html @@ -21,7 +21,7 @@ <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h3 id="project-addressbook-level-3">Project: AddressBook Level 3<a href="#project-addressbook-level-3" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>Given below are my contributions to the project.</p> <ul><li><p><strong>New Feature</strong>: Added the ability to undo/redo previous commands.</p> <ul><li>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.</li> <li>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.</li> <li>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.</li> <li>Credits: <em>{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}</em></li></ul></li> <li><p><strong>New Feature</strong>: Added a history command that allows the user to navigate to previous commands using up/down keys.</p></li> <li><p><strong>Code contributed</strong>: <a href="">RepoSense link</a></p></li> <li><p><strong>Project management</strong>:</p> <ul><li>Managed releases <code class="hljs inline no-lang">v1.3</code> - <code class="hljs inline no-lang">v1.5rc</code> (3 releases) on GitHub</li></ul></li> <li><p><strong>Enhancements to existing features</strong>:</p> <ul><li>Updated the GUI color scheme (Pull requests <a href="">#33</a>, <a href="">#34</a>)</li> <li>Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests <a href="">#36</a>, <a href="">#38</a>)</li></ul></li> <li><p><strong>Documentation</strong>:</p> <ul><li>User Guide: <ul><li>Added documentation for the features <code class="hljs inline no-lang">delete</code> and <code class="hljs inline no-lang">find</code> <a href="">#72</a></li> <li>Did cosmetic tweaks to existing documentation of features <code class="hljs inline no-lang">clear</code>, <code class="hljs inline no-lang">exit</code>: <a href="">#74</a></li></ul></li> <li>Developer Guide: -<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/team/solomonng.page-vue-render.js b/team/solomonng.page-vue-render.js index 3c517049c4c..1bf296918c0 100644 --- a/team/solomonng.page-vue-render.js +++ b/team/solomonng.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h3',{attrs:{"id":"project-addressbook-level-3"}},[_v("Project: AddressBook Level 3"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-addressbook-level-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("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.")]),_v(" "),_c('p',[_v("Given below are my contributions to the project.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added the ability to undo/redo previous commands.")]),_v(" "),_c('ul',[_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("Credits: "),_c('em',[_v("{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}")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added a history command that allows the user to navigate to previous commands using up/down keys.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code contributed")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("RepoSense link")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Project management")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Managed releases "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.3")]),_v(" - "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.5rc")]),_v(" (3 releases) on GitHub")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Enhancements to existing features")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Updated the GUI color scheme (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#33")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#34")]),_v(")")]),_v(" "),_c('li',[_v("Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#36")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#38")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Documentation")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("User Guide:\n"),_c('ul',[_c('li',[_v("Added documentation for the features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("find")]),_v(" "),_c('a',{attrs:{"href":""}},[_v("#72")])]),_v(" "),_c('li',[_v("Did cosmetic tweaks to existing documentation of features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clear")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("exit")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("#74")])])])]),_v(" "),_c('li',[_v("Developer Guide:\n"),_c('ul',[_c('li',[_v("Added implementation details of the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" feature.")])])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Community")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("PRs reviewed (with non-trivial review comments): "),_c('a',{attrs:{"href":""}},[_v("#12")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#32")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#19")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#42")])]),_v(" "),_c('li',[_v("Contributed to forum discussions (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("4")]),_v(")")]),_v(" "),_c('li',[_v("Reported bugs and suggestions for other teams in the class (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(")")]),_v(" "),_c('li',[_v("Some parts of the history feature I added was adopted by several other class mates ("),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Tools")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Integrated a third party library (Natty) to the project ("),_c('a',{attrs:{"href":""}},[_v("#42")]),_v(")")]),_v(" "),_c('li',[_v("Integrated a new Github plugin (CircleCI) to the team repo")])])]),_v(" "),_c('li',[_c('p',[_c('em',[_v("{you can add/remove categories in the list above}")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/team/yorklim.html b/team/yorklim.html index 32d3d3e33f1..d34283d9909 100644 --- a/team/yorklim.html +++ b/team/yorklim.html @@ -21,7 +21,7 @@ <div class="site-nav-dropdown-btn-container" data-v-e6005420><i onclick="handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();" class="site-nav-dropdown-btn-icon" data-v-e6005420><span aria-hidden="true" class="glyphicon glyphicon-menu-down" data-v-e6005420></span></i></div></div><ul class="site-nav-dropdown-container site-nav-list" data-v-e6005420><li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/TracingCode.html" data-v-e6005420>Tracing code</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/AddRemark.html" data-v-e6005420>Adding a command</a></div></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-1" data-v-e6005420><a href="/tp/tutorials/RemovingFields.html" data-v-e6005420>Removing Fields</a></div></li></ul></li> <li data-v-e6005420><div onclick="handleSiteNavClick(this)" class="site-nav-default-list-item site-nav-list-item-0" data-v-e6005420><a href="/tp/AboutUs.html" data-v-e6005420>About Us</a></div></li> <!----></ul></div></div> <!----></nav> <div id="content-wrapper"><h3 id="project-clientcare">Project: ClientCare<a href="#project-clientcare" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>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.</p> <p>Given below are my contributions to the project.</p> <ul><li><p><strong>New Feature</strong>: Added the ability to undo/redo previous commands.</p> <ul><li>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.</li> <li>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.</li> <li>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.</li> <li>Credits: <em>{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}</em></li></ul></li> <li><p><strong>New Feature</strong>: Added a history command that allows the user to navigate to previous commands using up/down keys.</p></li> <li><p><strong>Code contributed</strong>: <a href="">RepoSense link</a></p></li> <li><p><strong>Project management</strong>:</p> <ul><li>Managed releases <code class="hljs inline no-lang">v1.3</code> - <code class="hljs inline no-lang">v1.5rc</code> (3 releases) on GitHub</li></ul></li> <li><p><strong>Enhancements to existing features</strong>:</p> <ul><li>Updated the GUI color scheme (Pull requests <a href="">#33</a>, <a href="">#34</a>)</li> <li>Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests <a href="">#36</a>, <a href="">#38</a>)</li></ul></li> <li><p><strong>Documentation</strong>:</p> <ul><li>User Guide: <ul><li>Added documentation for the features <code class="hljs inline no-lang">delete</code> and <code class="hljs inline no-lang">find</code> <a href="">#72</a></li> <li>Did cosmetic tweaks to existing documentation of features <code class="hljs inline no-lang">clear</code>, <code class="hljs inline no-lang">exit</code>: <a href="">#74</a></li></ul></li> <li>Developer Guide: -<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<ul><li>Added implementation details of the <code class="hljs inline no-lang">delete</code> feature.</li></ul></li></ul></li> <li><p><strong>Community</strong>:</p> <ul><li>PRs reviewed (with non-trivial review comments): <a href="">#12</a>, <a href="">#32</a>, <a href="">#19</a>, <a href="">#42</a></li> <li>Contributed to forum discussions (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>, <a href="">4</a>)</li> <li>Reported bugs and suggestions for other teams in the class (examples: <a href="">1</a>, <a href="">2</a>, <a href="">3</a>)</li> <li>Some parts of the history feature I added was adopted by several other class mates (<a href="">1</a>, <a href="">2</a>)</li></ul></li> <li><p><strong>Tools</strong>:</p> <ul><li>Integrated a third party library (Natty) to the project (<a href="">#42</a>)</li> <li>Integrated a new Github plugin (CircleCI) to the team repo</li></ul></li> <li><p><em>{you can add/remove categories in the list above}</em></p></li></ul></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/team/yorklim.page-vue-render.js b/team/yorklim.page-vue-render.js index 37f667744ca..e32b73578ff 100644 --- a/team/yorklim.page-vue-render.js +++ b/team/yorklim.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{attrs:{"id":"content-wrapper"}},[_c('h3',{attrs:{"id":"project-clientcare"}},[_v("Project: ClientCare"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-clientcare","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("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.")]),_v(" "),_c('p',[_v("Given below are my contributions to the project.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added the ability to undo/redo previous commands.")]),_v(" "),_c('ul',[_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("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.")]),_v(" "),_c('li',[_v("Credits: "),_c('em',[_v("{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}")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("New Feature")]),_v(": Added a history command that allows the user to navigate to previous commands using up/down keys.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code contributed")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("RepoSense link")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Project management")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Managed releases "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.3")]),_v(" - "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("v1.5rc")]),_v(" (3 releases) on GitHub")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Enhancements to existing features")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Updated the GUI color scheme (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#33")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#34")]),_v(")")]),_v(" "),_c('li',[_v("Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests "),_c('a',{attrs:{"href":""}},[_v("#36")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#38")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Documentation")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("User Guide:\n"),_c('ul',[_c('li',[_v("Added documentation for the features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("find")]),_v(" "),_c('a',{attrs:{"href":""}},[_v("#72")])]),_v(" "),_c('li',[_v("Did cosmetic tweaks to existing documentation of features "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("clear")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("exit")]),_v(": "),_c('a',{attrs:{"href":""}},[_v("#74")])])])]),_v(" "),_c('li',[_v("Developer Guide:\n"),_c('ul',[_c('li',[_v("Added implementation details of the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" feature.")])])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Community")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("PRs reviewed (with non-trivial review comments): "),_c('a',{attrs:{"href":""}},[_v("#12")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#32")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#19")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("#42")])]),_v(" "),_c('li',[_v("Contributed to forum discussions (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("4")]),_v(")")]),_v(" "),_c('li',[_v("Reported bugs and suggestions for other teams in the class (examples: "),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("3")]),_v(")")]),_v(" "),_c('li',[_v("Some parts of the history feature I added was adopted by several other class mates ("),_c('a',{attrs:{"href":""}},[_v("1")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("2")]),_v(")")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Tools")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Integrated a third party library (Natty) to the project ("),_c('a',{attrs:{"href":""}},[_v("#42")]),_v(")")]),_v(" "),_c('li',[_v("Integrated a new Github plugin (CircleCI) to the team repo")])])]),_v(" "),_c('li',[_c('p',[_c('em',[_v("{you can add/remove categories in the list above}")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/tutorials/AddRemark.html b/tutorials/AddRemark.html index 2d90a19122d..4429c461796 100644 --- a/tutorials/AddRemark.html +++ b/tutorials/AddRemark.html @@ -174,7 +174,7 @@ </span><span> <span class="hljs-keyword">return</span> String.format(message, personToEdit); </span><span> } </span></code></pre><p><a href="/tp/images/add-remark/RemarkComplete.png" target="_self"><img src="/tp/images/add-remark/RemarkComplete.png" alt="Congratulations!" class="img-fluid"></a></p> <h2 id="writing-tests">Writing tests<a href="#writing-tests" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>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.</p> <p>Let’s verify the correctness of our code by writing some tests!</p> <p>Of course you can simply add the test cases manually, like you've been doing all along this tutorial. The result would be like the test cases in <a href="https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01">here</a>. Alternatively, you can get the help of IntelliJ to generate the skeletons of the test cases, as explained in the next section.</p> <h3 id="automatically-generating-tests">Automatically generating tests<a href="#automatically-generating-tests" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h3> <p>The goal is to write effective and efficient tests to ensure that <code class="hljs inline no-lang">RemarkCommand#execute()</code> behaves as expected.</p> <p>The convention for test names is <code class="hljs inline no-lang">methodName_testScenario_expectedResult</code>. An example would be -<code class="hljs inline no-lang">execute_filteredList_success</code>.</p> <p>Let’s create a test for <code class="hljs inline no-lang">RemarkCommand#execute()</code> to test that adding a remark works. On <code class="hljs inline no-lang">IntelliJ IDEA</code> you can bring up the context menu and choose to <code class="hljs inline no-lang">Go To</code> > <code class="hljs inline no-lang">Test</code> or use the appropriate keyboard shortcut.</p> <p><a href="/tp/images/add-remark/ContextMenu.png" target="_self"><img src="/tp/images/add-remark/ContextMenu.png" alt="Using the context menu to jump to tests" class="img-fluid"></a></p> <p>Then, create a test for the <code class="hljs inline no-lang">execute</code> method.</p> <p><a href="/tp/images/add-remark/CreateTest.png" target="_self"><img src="/tp/images/add-remark/CreateTest.png" alt="Creating a test for `execute`." class="img-fluid"></a></p> <p>Following convention, let’s change the name of the generated method to <code class="hljs inline no-lang">execute_addRemarkUnfilteredList_success</code>.</p> <p>Let’s use the utility functions provided in <code class="hljs inline no-lang">CommandTestUtil</code>. The functions ensure that commands produce the expected <code class="hljs inline no-lang">CommandResult</code> and output the correct message. In this case, <code class="hljs inline no-lang">CommandTestUtil#assertCommandSuccess</code> is the best fit as we are testing that a <code class="hljs inline no-lang">RemarkCommand</code> will successfully add a <code class="hljs inline no-lang">Remark</code>.</p> <p>You should end up with a test that looks something like <a href="https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49">this</a>.</p> <h2 id="conclusion">Conclusion<a href="#conclusion" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This concludes the tutorial for adding a new <code class="hljs inline no-lang">Command</code> to AddressBook.</p></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#tutorial-adding-a-command" data-v-e6005420>Tutorial: Adding a command</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#create-a-new-remark-command" data-v-e6005420>Create a new remark command</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#hook-remarkcommand-into-the-application" data-v-e6005420>Hook RemarkCommand into the application</a> <a class="nav-link py-1" href="#run-the-application" data-v-e6005420>Run the application</a></nav> <a class="nav-link py-1" href="#change-remarkcommand-to-throw-an-exception" data-v-e6005420>Change RemarkCommand to throw an exception</a> <a class="nav-link py-1" href="#enhancing-remarkcommand" data-v-e6005420>Enhancing RemarkCommand</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#make-the-command-accept-parameters" data-v-e6005420>Make the command accept parameters</a> <a class="nav-link py-1" href="#parse-user-input" data-v-e6005420>Parse user input</a></nav> <a class="nav-link py-1" href="#add-remark-to-the-model" data-v-e6005420>Add Remark to the model</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#add-a-new-remark-class" data-v-e6005420>Add a new Remark class</a> <a class="nav-link py-1" href="#make-use-of-remark" data-v-e6005420>Make use of Remark</a></nav> <a class="nav-link py-1" href="#add-a-placeholder-element-for-remark-to-the-ui" data-v-e6005420>Add a placeholder element for remark to the UI</a> <a class="nav-link py-1" href="#modify-person-to-support-a-remark-field" data-v-e6005420>Modify Person to support a Remark field</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#modify-person" data-v-e6005420>Modify Person</a> <a class="nav-link py-1" href="#update-other-usages-of-person" data-v-e6005420>Update other usages of Person</a></nav> <a class="nav-link py-1" href="#updating-storage" data-v-e6005420>Updating Storage</a> <a class="nav-link py-1" href="#finalizing-the-ui" data-v-e6005420>Finalizing the UI</a> <a class="nav-link py-1" href="#putting-everything-together" data-v-e6005420>Putting everything together</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#update-remarkcommand-and-remarkcommandparser" data-v-e6005420>Update RemarkCommand and RemarkCommandParser</a></nav> <a class="nav-link py-1" href="#writing-tests" data-v-e6005420>Writing tests</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#automatically-generating-tests" data-v-e6005420>Automatically generating tests</a></nav> <a class="nav-link py-1" href="#conclusion" data-v-e6005420>Conclusion</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +<code class="hljs inline no-lang">execute_filteredList_success</code>.</p> <p>Let’s create a test for <code class="hljs inline no-lang">RemarkCommand#execute()</code> to test that adding a remark works. On <code class="hljs inline no-lang">IntelliJ IDEA</code> you can bring up the context menu and choose to <code class="hljs inline no-lang">Go To</code> > <code class="hljs inline no-lang">Test</code> or use the appropriate keyboard shortcut.</p> <p><a href="/tp/images/add-remark/ContextMenu.png" target="_self"><img src="/tp/images/add-remark/ContextMenu.png" alt="Using the context menu to jump to tests" class="img-fluid"></a></p> <p>Then, create a test for the <code class="hljs inline no-lang">execute</code> method.</p> <p><a href="/tp/images/add-remark/CreateTest.png" target="_self"><img src="/tp/images/add-remark/CreateTest.png" alt="Creating a test for `execute`." class="img-fluid"></a></p> <p>Following convention, let’s change the name of the generated method to <code class="hljs inline no-lang">execute_addRemarkUnfilteredList_success</code>.</p> <p>Let’s use the utility functions provided in <code class="hljs inline no-lang">CommandTestUtil</code>. The functions ensure that commands produce the expected <code class="hljs inline no-lang">CommandResult</code> and output the correct message. In this case, <code class="hljs inline no-lang">CommandTestUtil#assertCommandSuccess</code> is the best fit as we are testing that a <code class="hljs inline no-lang">RemarkCommand</code> will successfully add a <code class="hljs inline no-lang">Remark</code>.</p> <p>You should end up with a test that looks something like <a href="https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49">this</a>.</p> <h2 id="conclusion">Conclusion<a href="#conclusion" onclick="event.stopPropagation()" class="fa fa-anchor"></a></h2> <p>This concludes the tutorial for adding a new <code class="hljs inline no-lang">Command</code> to AddressBook.</p></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#tutorial-adding-a-command" data-v-e6005420>Tutorial: Adding a command</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#create-a-new-remark-command" data-v-e6005420>Create a new remark command</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#hook-remarkcommand-into-the-application" data-v-e6005420>Hook RemarkCommand into the application</a> <a class="nav-link py-1" href="#run-the-application" data-v-e6005420>Run the application</a></nav> <a class="nav-link py-1" href="#change-remarkcommand-to-throw-an-exception" data-v-e6005420>Change RemarkCommand to throw an exception</a> <a class="nav-link py-1" href="#enhancing-remarkcommand" data-v-e6005420>Enhancing RemarkCommand</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#make-the-command-accept-parameters" data-v-e6005420>Make the command accept parameters</a> <a class="nav-link py-1" href="#parse-user-input" data-v-e6005420>Parse user input</a></nav> <a class="nav-link py-1" href="#add-remark-to-the-model" data-v-e6005420>Add Remark to the model</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#add-a-new-remark-class" data-v-e6005420>Add a new Remark class</a> <a class="nav-link py-1" href="#make-use-of-remark" data-v-e6005420>Make use of Remark</a></nav> <a class="nav-link py-1" href="#add-a-placeholder-element-for-remark-to-the-ui" data-v-e6005420>Add a placeholder element for remark to the UI</a> <a class="nav-link py-1" href="#modify-person-to-support-a-remark-field" data-v-e6005420>Modify Person to support a Remark field</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#modify-person" data-v-e6005420>Modify Person</a> <a class="nav-link py-1" href="#update-other-usages-of-person" data-v-e6005420>Update other usages of Person</a></nav> <a class="nav-link py-1" href="#updating-storage" data-v-e6005420>Updating Storage</a> <a class="nav-link py-1" href="#finalizing-the-ui" data-v-e6005420>Finalizing the UI</a> <a class="nav-link py-1" href="#putting-everything-together" data-v-e6005420>Putting everything together</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#update-remarkcommand-and-remarkcommandparser" data-v-e6005420>Update RemarkCommand and RemarkCommandParser</a></nav> <a class="nav-link py-1" href="#writing-tests" data-v-e6005420>Writing tests</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#automatically-generating-tests" data-v-e6005420>Automatically generating tests</a></nav> <a class="nav-link py-1" href="#conclusion" data-v-e6005420>Conclusion</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/tutorials/AddRemark.page-vue-render.js b/tutorials/AddRemark.page-vue-render.js index 735be950a7e..dcabcd81c73 100644 --- a/tutorials/AddRemark.page-vue-render.js +++ b/tutorials/AddRemark.page-vue-render.js @@ -290,6 +290,6 @@ with(this){return _c('h2',{attrs:{"id":"conclusion"}},[_v("Conclusion"),_c('a',{ with(this){return _c('p',[_v("This concludes the tutorial for adding a new "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Command")]),_v(" to AddressBook.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/tutorials/RemovingFields.html b/tutorials/RemovingFields.html index 37551839bff..b015ac60f0d 100644 --- a/tutorials/RemovingFields.html +++ b/tutorials/RemovingFields.html @@ -39,7 +39,7 @@ </span><span> <span class="hljs-attr">"address"</span>: <span class="hljs-string">"4th street"</span> </span><span> } ] </span><span>} -</span></code></pre><p>You can go through each individual <code class="hljs inline no-lang">json</code> file and manually remove the <code class="hljs inline no-lang">address</code> field.</p></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#tutorial-removing-fields" data-v-e6005420>Tutorial: Removing Fields</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#safely-deleting-address" data-v-e6005420>Safely deleting Address</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#assisted-refactoring" data-v-e6005420>Assisted refactoring</a> <a class="nav-link py-1" href="#manual-refactoring" data-v-e6005420>Manual refactoring</a></nav> <a class="nav-link py-1" href="#tidying-up" data-v-e6005420>Tidying up</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +</span></code></pre><p>You can go through each individual <code class="hljs inline no-lang">json</code> file and manually remove the <code class="hljs inline no-lang">address</code> field.</p></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#tutorial-removing-fields" data-v-e6005420>Tutorial: Removing Fields</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#safely-deleting-address" data-v-e6005420>Safely deleting Address</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#assisted-refactoring" data-v-e6005420>Assisted refactoring</a> <a class="nav-link py-1" href="#manual-refactoring" data-v-e6005420>Manual refactoring</a></nav> <a class="nav-link py-1" href="#tidying-up" data-v-e6005420>Tidying up</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/tutorials/RemovingFields.page-vue-render.js b/tutorials/RemovingFields.page-vue-render.js index 1dbae4668e3..67fae84a2aa 100644 --- a/tutorials/RemovingFields.page-vue-render.js +++ b/tutorials/RemovingFields.page-vue-render.js @@ -107,6 +107,6 @@ with(this){return _c('pre',[_c('code',{pre:true,attrs:{"class":"hljs json"}},[_c with(this){return _c('p',[_v("You can go through each individual "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("json")]),_v(" file and manually remove the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("address")]),_v(" field.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/tutorials/TracingCode.html b/tutorials/TracingCode.html index 7c4bf06c552..d717fd5cffc 100644 --- a/tutorials/TracingCode.html +++ b/tutorials/TracingCode.html @@ -104,7 +104,7 @@ do you think will happen if we traced the following commands instead? What exceptions do you think will be thrown (if any), where will the exceptions be thrown and where will they be handled?</p> <ol><li><p><code class="hljs inline no-lang">redit 1 n/Alice Yu</code></p></li> <li><p><code class="hljs inline no-lang">edit 0 n/Alice Yu</code></p></li> <li><p><code class="hljs inline no-lang">edit 1 n/Alex Yeoh</code></p></li> <li><p><code class="hljs inline no-lang">edit 1</code></p></li> <li><p><code class="hljs inline no-lang">edit 1 n/アリス ユー</code></p></li> <li><p><code class="hljs inline no-lang">edit 1 t/one t/two t/three t/one</code></p></li></ol></li> <li><p>What components will you have to modify to perform the following -enhancements to the application?</p> <ol><li><p>Make command words case-insensitive</p></li> <li><p>Allow <code class="hljs inline no-lang">delete</code> to remove more than one index at a time</p></li> <li><p>Save the address book in the CSV format instead</p></li> <li><p>Add a new command</p></li> <li><p>Add a new field to <code class="hljs inline no-lang">Person</code></p></li> <li><p>Add a new entity to the address book</p></li></ol></li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#tutorial-tracing-code" data-v-e6005420>Tutorial: Tracing code</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#before-we-start" data-v-e6005420>Before we start</a> <a class="nav-link py-1" href="#setting-a-breakpoint" data-v-e6005420>Setting a breakpoint</a> <a class="nav-link py-1" href="#tracing-the-execution-path" data-v-e6005420>Tracing the execution path</a> <a class="nav-link py-1" href="#conclusion" data-v-e6005420>Conclusion</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]</small></div></footer></div> +enhancements to the application?</p> <ol><li><p>Make command words case-insensitive</p></li> <li><p>Allow <code class="hljs inline no-lang">delete</code> to remove more than one index at a time</p></li> <li><p>Save the address book in the CSV format instead</p></li> <li><p>Add a new command</p></li> <li><p>Add a new field to <code class="hljs inline no-lang">Person</code></p></li> <li><p>Add a new entity to the address book</p></li></ol></li></ol></div> <nav id="page-nav" data-v-e6005420><div class="nav-component slim-scroll" data-v-e6005420><nav id="mb-page-nav" class="nav nav-pills flex-column my-0 small no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#tutorial-tracing-code" data-v-e6005420>Tutorial: Tracing code</a> <nav class="nav nav-pills flex-column my-0 nested no-flex-wrap" data-v-e6005420><a class="nav-link py-1" href="#before-we-start" data-v-e6005420>Before we start</a> <a class="nav-link py-1" href="#setting-a-breakpoint" data-v-e6005420>Setting a breakpoint</a> <a class="nav-link py-1" href="#tracing-the-execution-path" data-v-e6005420>Tracing the execution path</a> <a class="nav-link py-1" href="#conclusion" data-v-e6005420>Conclusion</a></nav> <!----></nav></div> <!----></nav> <div aria-hidden="true" class="scroll-top-button fa-lg d-print-none" style="display:none;bottom:2%;right:2%;position:fixed;"><i class="fas fa-arrow-circle-up"></i></div></div> <footer><div class="text-center"><small>[<span><strong>Powered by</strong></span> <img src="https://markbind.org/favicon.ico" width="30"> <a href="https://markbind.org/">MarkBind 5.4.0</a>, generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]</small></div></footer></div> </body><script src="/tp/markbind/js/bootstrap-utility.min.js"></script> <script> MarkBind.setupWithSearch() diff --git a/tutorials/TracingCode.page-vue-render.js b/tutorials/TracingCode.page-vue-render.js index 3ccf95c89a5..1abc7d6dda5 100644 --- a/tutorials/TracingCode.page-vue-render.js +++ b/tutorials/TracingCode.page-vue-render.js @@ -164,6 +164,6 @@ with(this){return _c('h2',{attrs:{"id":"conclusion"}},[_v("Conclusion"),_c('a',{ with(this){return _c('ol',[_c('li',[_c('p',[_v("In this tutorial, we traced the \"happy path\" (i.e., no errors). What\ndo you think will happen if we traced the following commands\ninstead? What exceptions do you think will be thrown (if any), where\nwill the exceptions be thrown and where will they be handled?")]),_v(" "),_c('ol',[_c('li',[_c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("redit 1 n/Alice Yu")])])]),_v(" "),_c('li',[_c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("edit 0 n/Alice Yu")])])]),_v(" "),_c('li',[_c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("edit 1 n/Alex Yeoh")])])]),_v(" "),_c('li',[_c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("edit 1")])])]),_v(" "),_c('li',[_c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("edit 1 n/アリス ユー")])])]),_v(" "),_c('li',[_c('p',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("edit 1 t/one t/two t/three t/one")])])])])]),_v(" "),_c('li',[_c('p',[_v("What components will you have to modify to perform the following\nenhancements to the application?")]),_v(" "),_c('ol',[_c('li',[_c('p',[_v("Make command words case-insensitive")])]),_v(" "),_c('li',[_c('p',[_v("Allow "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete")]),_v(" to remove more than one index at a time")])]),_v(" "),_c('li',[_c('p',[_v("Save the address book in the CSV format instead")])]),_v(" "),_c('li',[_c('p',[_v("Add a new command")])]),_v(" "),_c('li',[_c('p',[_v("Add a new field to "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Person")])])]),_v(" "),_c('li',[_c('p',[_v("Add a new entity to the address book")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 10:49:02 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.4.0")]),_v(", generated on Thu, 11 Apr 2024, 13:17:17 GMT+8]")])])])} }]; \ No newline at end of file