diff --git a/.travis.yml b/.travis.yml index 924a42eb8da..9611d30f9d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ matrix: - jdk: openjdk11 script: >- - ./config/travis/run-checks.sh && - ./gradlew clean checkstyleMain checkstyleTest test coverage coveralls asciidoctor + ./config/travis/run-checks.sh && + ./gradlew clean checkstyleMain checkstyleTest test coverage coveralls asciidoctor deploy: skip_cleanup: true diff --git a/ArchitectureSequenceDiagram.png b/ArchitectureSequenceDiagram.png new file mode 100644 index 00000000000..45ced7af5a0 Binary files /dev/null and b/ArchitectureSequenceDiagram.png differ diff --git a/LogicClassDiagram.png b/LogicClassDiagram.png new file mode 100644 index 00000000000..187559269f3 Binary files /dev/null and b/LogicClassDiagram.png differ diff --git a/README.adoc b/README.adoc index e36efe534bb..051243a2b1e 100644 --- a/README.adoc +++ b/README.adoc @@ -1,36 +1,56 @@ -= Address Book (Level 3) -ifdef::env-github,env-browser[:relfileprefix: docs/] += Study Buddy +======= + +== Introduction -https://travis-ci.org/se-edu/addressbook-level3[image:https://travis-ci.org/se-edu/addressbook-level3.svg?branch=master[Build Status]] -https://ci.appveyor.com/project/damithc/addressbook-level3[image:https://ci.appveyor.com/api/projects/status/3boko2x2vr5cc3w2?svg=true[Build status]] -https://coveralls.io/github/se-edu/addressbook-level3?branch=master[image:https://coveralls.io/repos/github/se-edu/addressbook-level3/badge.svg?branch=master[Coverage Status]] -https://www.codacy.com/app/damith/addressbook-level3?utm_source=github.com&utm_medium=referral&utm_content=se-edu/addressbook-level3&utm_campaign=Badge_Grade[image:https://api.codacy.com/project/badge/Grade/fc0b7775cf7f4fdeaf08776f3d8e364a[Codacy Badge]] +ifdef::env-github,env-browser[:relfileprefix: docs/] +https://travis-ci.org/AY1920S2-CS2103T-W16-3/main[image:https://travis-ci.org/AY1920S2-CS2103T-W16-3/main.svg?branch=master[Build Status]] +https://coveralls.io/github/AY1920S2-CS2103T-W16-3/main?branch=master[image:https://coveralls.io/repos/github/AY1920S2-CS2103T-W16-3/main/badge.svg?branch=master&service=github[Coverage Status]] +https://ci.appveyor.com/project/teikjun/main-obe5y/branch/master[image:https://ci.appveyor.com/api/projects/status/01kv1ged83vovfi3/branch/master?svg=true[Build status]] +https://www.codacy.com/gh/AY1920S2-CS2103T-W16-3/main?utm_source=github.com&utm_medium=referral&utm_content=AY1920S2-CS2103T-W16-3/main&utm_campaign=Badge_Grade[image:https://api.codacy.com/project/badge/Grade/8ff09067ff534489afad2264bade805a[Codacy Badge]] ifdef::env-github[] image::docs/images/Ui.png[width="600"] endif::[] ifndef::env-github[] -image::images/Ui.png[width="600"] +image::images/Ui.png[width="600",title="UI Sample Picture, will be updated in ther future"] endif::[] -* This is a desktop Address Book application. It has a GUI but most of the user interactions happen using a CLI (Command Line Interface). -* It is a Java sample application intended for students learning Software Engineering while using Java as the main programming language. -* It is *written in OOP fashion*. It provides a *reasonably well-written* code example that is *significantly bigger* (around 6 KLoC)than what students usually write in beginner-level SE modules. +=== What is Study Buddy ? + +* Study Buddy is a task management tool for students who wish to organise their tasks more efficiently. +* With the help of Study Buddy, students can easily view and manage their module related tasks. +* Sort, filter and search commands are also provided to make the interaction more useful. +* It also provides services to show the statistics for time, grades breakdown and workload comparison between different modules in Pie charts. +This visualisation of data helps students become more aware of their Pending work and which tasks to spend more time on. + +=== Who can benefit most from Study Buddy? + +======= +* It is designed for students who can type fast and are comfortable with `Command-Line Interface(CLI)`. +======= + +=== What is CLI? + +* CLI is a command line program that accepts text input to execute operating system functions. +* Compare with graphical user interfaces(GUI), CLI performs interaction with user by keyboard input instead of mouse clicking, such as command window. == Site Map +To browse more information, please check our site map: + * <> * <> -* <> * <> * <> == Acknowledgements -* Some parts of this sample application were inspired by the excellent http://code.makery.ch/library/javafx-8-tutorial/[Java FX tutorial] by -_Marco Jakob_. -* Libraries used: https://openjfx.io/[JavaFX], https://github.com/FasterXML/jackson[Jackson], https://github.com/junit-team/junit5[JUnit5] +* Some parts of this application were inspired by the excellent +http://code.makery.ch/library/javafx-8-tutorial/[Java FX tutorial] by _Marco Jakob_. +* Libraries used: https://openjfx.io/[JavaFX], +https://github.com/FasterXML/jackson[Jackson], https://github.com/junit-team/junit5[JUnit5] +* AddressBook-Level3 project created by SE-EDU initiative at https://se-education.org -== Licence : link:LICENSE[MIT] diff --git a/README.html b/README.html new file mode 100644 index 00000000000..cb29b1ef11a --- /dev/null +++ b/README.html @@ -0,0 +1,2269 @@ + + + + + + + + StudyBuddy + + + + + +
+
+

Introduction

+
+
+

Build Status

+
+
+
+ Ui +
+
Figure 1. UI Sample Picture, will be updated in ther future
+
+
+

What is StudyBuddy ?

+
+
    +
  • +

    StudyBuddy is a task keeper for students who wish to manage their time more + efficiently.

    +
  • +
  • +

    With the help of StudyBuddy, students can easily manage and view their school tasks.

    +
  • +
  • +

    Sort, filter and search commands are also provided to make the interaction more + meaningful.

    +
  • +
  • +

    It also provides services to show the statistics for time, grades breakdown and workload + comparison between different + modules in Pie charts. With this visualisation of data, students can be more aware of + their time management.

    +
  • +
+
+
+
+

Who can benefit most from StudyBuddy ?

+
+
    +
  • +

    It is designed for students who are able to type fast and comfortable with Command-Line + Interface(CLI).

    +
  • +
+
+
+
+

What is CLI?

+
+
    +
  • +

    CLI is a command line program that accepts text input to execute operating system + functions.

    +
  • +
  • +

    Compare with graphical user interfaces(GUI), CLI performs interaction with user by + keyboard input instead of + mouse clicking, such as cmd window.

    +
  • +
+
+
+
+
+
+

Site Map

+
+
+

To browse more information, please check our site map:

+
+
+ +
+
+
+
+

Acknowledgements

+
+
+ +
+
+
+
+

Licence : MIT

+
+ +
+
+
+ + + diff --git a/appveyor.yml b/appveyor.yml index 6f53e7cd2d6..a3f8f434533 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,14 +5,14 @@ # --no-daemon: Prevent the daemon from launching to prevent file-in-use errors # when we cache the ~/.gradle directory build_script: - - gradlew.bat --no-daemon assemble checkstyleMain checkstyleTest + - gradlew.bat --no-daemon assemble checkstyleMain checkstyleTest test_script: - - gradlew.bat --no-daemon test + - gradlew.bat --no-daemon test environment: - JAVA_HOME: C:\Program Files\Java\jdk11 # Use 64-bit Java + JAVA_HOME: C:\Program Files\Java\jdk11 # Use 64-bit Java # Files/folders to preserve between builds to speed them up cache: - - C:\Users\appveyor\.gradle + - C:\Users\appveyor\.gradle diff --git a/build.gradle b/build.gradle index 93029ef8262..ba7a89ed780 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ plugins { } // Specifies the entry point of the application -mainClassName = 'seedu.address.Main' +mainClassName = 'draganddrop.studybuddy.Main' sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 @@ -67,7 +67,7 @@ dependencies { } shadowJar { - archiveName = 'addressbook.jar' + archiveName = 'studybuddy.jar' destinationDir = file("${buildDir}/jar/") } @@ -120,22 +120,22 @@ asciidoctor { outputDir "${buildDir}/docs" options = [ - template_dirs: [file("${sourceDir}/templates")], + template_dirs: [file("${sourceDir}/templates")], ] attributes = [ - linkcss: true, - stylesheet: 'gh-pages.css', - 'source-highlighter': 'coderay', - icons: 'font', - experimental: true, - sectlinks: true, - idprefix: '', // for compatibility with GitHub preview - idseparator: '-', - 'site-root': "${sourceDir}", // must be the same as sourceDir, do not modify - 'site-name': 'AddressBook-Level3', - 'site-githuburl': 'https://github.com/se-edu/addressbook-level3', - 'site-seedu': true, // delete this line if your project is not a fork (not a SE-EDU project) + linkcss : true, + stylesheet : 'gh-pages.css', + 'source-highlighter': 'coderay', + icons : 'font', + experimental : true, + sectlinks : true, + idprefix : '', // for compatibility with GitHub preview + idseparator : '-', + 'site-root' : "${sourceDir}", // must be the same as sourceDir, do not modify + 'site-name' : 'StudyBuddy', + 'site-githuburl' : 'https://github.com/AY1920S2-CS2103T-W16-3/main', + 'site-draganddrop' : true, // delete this line if your project is not a fork (not a SE-EDU project) ] options['template_dirs'].each { diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 24eaeb44965..5bc0b9003c5 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -1,7 +1,7 @@ + "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" + "https://checkstyle.org/dtds/configuration_1_3.dtd"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - - + + + + - - - + + - + + - - + + - - - - - - - - - - - - + + + + + + - - - - - + - - - + + + + + + + + + - if (true) { return 1; } // Not allowed + + - else if { - return 1; // else if should always be multi line - } + - if (true) - return 1; // Not allowed - --> - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - + + - + + + - - - - - - + - - - - - - - - - - - - - - + + - - - - - - + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml index dabcd1ff4e3..acd00281cbd 100644 --- a/config/checkstyle/suppressions.xml +++ b/config/checkstyle/suppressions.xml @@ -1,9 +1,9 @@ + "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN" + "https://checkstyle.org/dtds/suppressions_1_2.dtd"> - + diff --git a/copyright.txt b/copyright.txt index 93aa2a39ce2..3a30d773b2c 100644 --- a/copyright.txt +++ b/copyright.txt @@ -1,9 +1,5 @@ Some code adapted from http://code.makery.ch/library/javafx-8-tutorial/ by Marco Jakob -Copyright by Susumu Yoshida - http://www.mcdodesign.com/ -- address_book_32.png -- AddressApp.ico - Copyright by Jan Jan Kovařík - http://glyphicons.com/ - calendar.png - edit.png diff --git a/docs/ [CS2103T-W16-3][Souwmyaa Sabarinathann]UML Diagrams.adoc b/docs/ [CS2103T-W16-3][Souwmyaa Sabarinathann]UML Diagrams.adoc new file mode 100644 index 00000000000..6315ee0cd6f --- /dev/null +++ b/docs/ [CS2103T-W16-3][Souwmyaa Sabarinathann]UML Diagrams.adoc @@ -0,0 +1,52 @@ +:imagesDir: images +:bl: pass:[ +] +:stylesDir: ./stylesheets + +== [teal]#UML Diagrams# + +By: `Souwmyaa` + +=== [teal]#Model class diagram# + +image::ModelClassDiagram.png[width = "400", length = "300"] +[teal]#Structure of the Model Component# + +[teal]#*Description:*# + +Explains the inner workings of the Model component of the code base. + +Gives an overall understanding of how `Model`, `StudyBuddy` and `Task` work together. + +{bl} +{bl} + +=== [teal]#Delete Due Soon Task Sequence diagram# + +image::DeleteDueSoonSequence.png[width = "500", length = "600"] + +[teal]#Sequence Diagram for Delete from Due Soon list# + +[teal]#*Description:*# + +Explains how tasks are auto-deleted from the due soon list upon deletion from main list. + +This diagram helps potential developers understand how all functions that affect this list would work. + + +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} + +=== [teal]#Refresh activity diagram# + +image::DueSoonActivityDiagram.png[width = "500", length = "600"] + +[teal]#Activity diagram for refresh# + +[teal]#*Description:*# + +Explains the general control flow of the refresh command. + diff --git a/docs/AboutUs.adoc b/docs/AboutUs.adoc index 458e6134f45..d2c32e1a25f 100644 --- a/docs/AboutUs.adoc +++ b/docs/AboutUs.adoc @@ -4,53 +4,53 @@ :imagesDir: images :stylesDir: stylesheets -AddressBook - Level 3 was developed by the https://se-edu.github.io/docs/Team.html[se-edu] team. + -_{The dummy content given below serves as a placeholder to be used by future forks of the project.}_ + -{empty} + -We are a team based in the http://www.comp.nus.edu.sg[School of Computing, National University of Singapore]. +IVLE was developed by our team that is based in the http://www.comp.nus.edu.sg[School of Computing, National University of Singapore] + + +{empty} == Project Team -=== John Doe -image::damithc.jpg[width="150", align="left"] -{empty}[http://www.comp.nus.edu.sg/~damithch[homepage]] [https://github.com/damithc[github]] [<>] +=== Huang Ge Xiang + +image::gx-huang.png[width="150",align= "left"] +{empty}[http://github.com/gx-huang[github]][<>] -Role: Project Advisor +Responsibilities: Testing + Deadlines ''' -=== John Roe -image::lejolly.jpg[width="150", align="left"] -{empty}[http://github.com/lejolly[github]] [<>] +=== Wang Yuting + +image::wyt-sonia.png[width="150",align="left"] +{empty}[http://github.com/wyt-sonia[github]][<>] -Role: Team Lead + -Responsibilities: UI +Responsibilities: Team Lead + Integration ''' -=== Johnny Doe -image::yijinl.jpg[width="150", align="left"] -{empty}[http://github.com/yijinl[github]] [<>] +=== Teik Jun Tan -Role: Developer + -Responsibilities: Data +image::teikjun.png[width="150",align="left"] +{empty}[http://github.com/teikjun[github]][<>] + +Responsibilities: Team lead (assistant) + Integration + Testing ''' -=== Johnny Roe -image::m133225.jpg[width="150", align="left"] -{empty}[http://github.com/m133225[github]] [<>] +=== Souwmyaa Sabarinathann + +image::souwmyaa.png[width="150",align="left"] +{empty}[http://github.com/souwmyaa[github]] [<>] -Role: Developer + -Responsibilities: Dev Ops + Threading +Responsibilities: Documentation + Deliverables + deadlines ''' -=== Benson Meier -image::yl_coder.jpg[width="150", align="left"] -{empty}[http://github.com/yl-coder[github]] [<>] +=== Hong Wen + +image::aegis-bot.png[width="150",align="left"] +{empty}[http://github.com/aegis-bot[github]] [<>] -Role: Developer + -Responsibilities: UI +Responsibilities: Code Quality ''' diff --git a/docs/ContactUs.adoc b/docs/ContactUs.adoc index 81be279ef6d..d0bc6077575 100644 --- a/docs/ContactUs.adoc +++ b/docs/ContactUs.adoc @@ -2,6 +2,7 @@ :site-section: ContactUs :stylesDir: stylesheets -* *Bug reports, Suggestions* : Post in our https://github.com/se-edu/addressbook-level3/issues[issue tracker] if you noticed bugs or have suggestions on how to improve. -* *Contributing* : We welcome pull requests. Follow the process described https://github.com/oss-generic/process[here] -* *Email us* : You can also reach us at `damith [at] comp.nus.edu.sg` +* *Bug reports, Suggestions* : Post in our https://github.com/AY1920S2-CS2103T-W16-3/main/issues[issue tracker] if you noticed bugs or have suggestions on how to improve. +* *Contributing* : We welcome pull requests. +Follow the process described https://github.com/oss-generic/process[here] +* *Email us* : You can also reach us at `e0341280 [at] u.nus.edu`, `e0365980 [at] gmail.com`, `e0325702 [at] u.nus.edu`, `e0325606 [at] u.nus.edu` diff --git a/docs/DevOps.adoc b/docs/DevOps.adoc index 2aa5a6bc0c1..c0de95f00e8 100644 --- a/docs/DevOps.adoc +++ b/docs/DevOps.adoc @@ -1,4 +1,4 @@ -= AddressBook Level 3 - Dev Ops += Study Buddy - Dev Ops :site-section: DeveloperGuide :toc: :toc-title: @@ -12,7 +12,7 @@ ifdef::env-github[] :note-caption: :information_source: :warning-caption: :warning: endif::[] -:repoURL: https://github.com/se-edu/addressbook-level3/tree/master +:repoURL: https://github.com/AY1920S2-CS2103T-W16-3/main == Build Automation @@ -20,28 +20,34 @@ See <> to learn how to use Gradle for build auto == Continuous Integration -We use https://travis-ci.org/[Travis CI] and https://www.appveyor.com/[AppVeyor] to perform _Continuous Integration_ on our projects. See <> and <> for more details. +We use https://travis-ci.org/[Travis CI] and https://www.appveyor.com/[AppVeyor] to perform _Continuous Integration_ on our projects. +See <> and <> for more details. == Coverage Reporting -We use https://coveralls.io/[Coveralls] to track the code coverage of our projects. See <> for more details. +We use https://coveralls.io/[Coveralls] to track the code coverage of our projects. +See <> for more details. == Documentation Previews -When a pull request has changes to asciidoc files, you can use https://www.netlify.com/[Netlify] to see a preview of how the HTML version of those asciidoc files will look like when the pull request is merged. See <> for more details. +When a pull request has changes to asciidoc files, you can use https://www.netlify.com/[Netlify] to see a preview of how the HTML version of those asciidoc files will look like when the pull request is merged. +See <> for more details. == Making a Release Here are the steps to create a new release. -. Update the version number in link:{repoURL}/src/main/java/seedu/address/MainApp.java[`MainApp.java`]. -. Generate a JAR file <>. -. Tag the repo with the version number. e.g. `v0.1` -. https://help.github.com/articles/creating-releases/[Create a new release using GitHub] and upload the JAR file you created. +. Update the version number in link:{repoURL}/src/main/java/draganddrop/address/MainApp.java[`MainApp.java`]. +. Generate a JAR file <>. +. Tag the repo with the version number. e.g. `v0.1` +. https://help.github.com/articles/creating-releases/[Create a new release using GitHub] and upload the JAR file you created. == Managing Dependencies -A project often depends on third-party libraries. For example, Address Book depends on the https://github.com/FasterXML/jackson[Jackson library] for JSON parsing. Managing these _dependencies_ can be automated using Gradle. For example, Gradle can download the dependencies automatically, which is better than these alternatives: +A project often depends on third-party libraries. +For example, Study Buddy depends on the https://github.com/FasterXML/jackson[Jackson library] for JSON parsing. +Managing these _dependencies_ can be automated using Gradle. +For example, Gradle can download the dependencies automatically, which is better than these alternatives: [loweralpha] . Include those libraries in the repo (this bloats the repo size) diff --git a/docs/DeveloperGuide.adoc b/docs/DeveloperGuide.adoc index 3d65905a853..3def1c21467 100644 --- a/docs/DeveloperGuide.adoc +++ b/docs/DeveloperGuide.adoc @@ -1,6 +1,7 @@ -= AddressBook Level 3 - Developer Guide += Study Buddy - Developer Guide :site-section: DeveloperGuide :toc: +:bl: pass:[ +] :toc-title: :toc-placement: preamble :sectnums: @@ -10,31 +11,66 @@ ifdef::env-github[] :tip-caption: :bulb: :note-caption: :information_source: -:warning-caption: :warning: +:caution-caption: :fire: +:important-caption: :heavy_exclamation_mark: endif::[] -:repoURL: https://github.com/se-edu/addressbook-level3/tree/master +:repoURL: https://github.com/AY1920S2-CS2103T-W16-3/main +:jdk_bug_report: https://bugs.openjdk.java.net/browse/JDK-8198830 -By: `Team SE-EDU`      Since: `Jun 2016`      Licence: `MIT` +By: `Team Drag&Drop`      Since: `Jan 2020`      + +//updated by Souwmyaa +//tag::introduction[] +== Introduction +Study Buddy is a task-management tool made for students who want to be able to track and manage their tasks in one place. + +It uses various visualization tools such as pie charts and calendars, provides useful features such as the Due Soon task list, a productivity tracker etc to make task management simple and convenient. + +In particular, Study Buddy is a Command Line Interface (<>) application that also provides some Graphical User Interface (<>). This means that users are expected to interact with their Study Buddy mainly through the command line, but each command executed will evoke a visual response as well. + +The purpose of this guide is to help potential developers get up to speed on the Study Buddy code base and functionality. We hope that this document will ease the process of further enhancing and developing Study Buddy. +//end::introduction[] == Setting up Refer to the guide <>. +//updated by Souwmyaa +== Commonly Used Symbols + +[NOTE] +This symbol indicates something you should take note of. + +[TIP] +This symbol indicates a tip that you could use. + +[CAUTION] +This symbol indicates an aspect that should be used with caution. + +[IMPORTANT] +This symbol indicates something to which we want to draw your attention. + == Design +//tag::ArchitectureDiagram[] + [[Design-Architecture]] === Architecture .Architecture Diagram image::ArchitectureDiagram.png[] -The *_Architecture Diagram_* given above explains the high-level design of the App. Given below is a quick overview of each component. +The *_Architecture Diagram_* given above explains the high-level design of the App. +Given below is a quick overview of each component. + +//end::ArchitectureDiagram[] [TIP] -The `.puml` files used to create diagrams in this document can be found in the link:{repoURL}/docs/diagrams/[diagrams] folder. +The `.puml` files used to create diagrams in this document can be found in the link:{repoURL}/tree/master/docs/diagrams[diagrams] folder. Refer to the <> to learn how to create and edit diagrams. -`Main` has two classes called link:{repoURL}/src/main/java/seedu/address/Main.java[`Main`] and link:{repoURL}/src/main/java/seedu/address/MainApp.java[`MainApp`]. It is responsible for, +`Main` has two classes called link:{repoURL}/blob/master/src/main/java/draganddrop/studybuddy/Main.java[`Main`] and link:{repoURL}/blob/master/src/main/java/draganddrop/studybuddy/MainApp.java[`MainApp`]. +It is responsible for, * At app launch: Initializes the components in the correct sequence, and connects them up with each other. * At shut down: Shuts down the components and invokes cleanup method where necessary. @@ -59,7 +95,10 @@ Each of the four components For example, the `Logic` component (see the class diagram given below) defines it's API in the `Logic.java` interface and exposes its functionality using the `LogicManager.java` class. .Class Diagram of the Logic Component -image::LogicClassDiagram.png[] +image::LogicClassDiagram.png[width = "800", length = "500"] + +[NOTE] +HiddenModel is used to represent the hidden contents of the Model Component. [discrete] ==== How the architecture components interact with each other @@ -67,184 +106,706 @@ image::LogicClassDiagram.png[] The _Sequence Diagram_ below shows how the components interact with each other for the scenario where the user issues the command `delete 1`. .Component interactions for `delete 1` command -image::ArchitectureSequenceDiagram.png[] +image::ArchitectureSequenceDiagram.png[width = "450"] The sections below give more details of each component. -[[Design-Ui]] +//tag::UIComponent[] === UI component .Structure of the UI Component -image::UiClassDiagram.png[] +image::UiClassDiagram.png[width = "650" ] + +*API* : link:{repoURL}/tree/master/src/main/java/draganddrop/studybuddy/ui[`Ui.java`] + +The `UI` consists of a `MainWindow` which is made up by different components such as `StatusBarFooter`, `FeedbackDisplayBox`, + `CommandBox` as well as variants `Panels` and `Cards`. All these components, including the `MainWindow`, inherit from the abstract `UiPart` class. + +The `UI` component uses JavaFx UI framework. +The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. +For example, the layout of the link:{repoURL}/blob/master/src/main/java/draganddrop/studybuddy/ui/MainWindow.java[`MainWindow`] is specified in link:{repoURL}/blob/master/src/main/resources/view/MainWindow.fxml[`MainWindow.fxml`] -*API* : link:{repoURL}/src/main/java/seedu/address/ui/Ui.java[`Ui.java`] -The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class. +The `UI` component:: +* *Interacts with user* in an interactive process with the help of `Logic` component. +** `CommandBox` collects the user keyboard input. +** `Logic` parses user input in each interaction and executes the command subsequently if the interaction ends without any exception. +** `FeedbackDisplayBox` responses system information to user, such as error message and command execution result. +*** When invalid input received, proper message will respond via `FeedbackDisplayBox`. The interaction of the command will not be terminated, user can continue with the process with valid input. -The `UI` component uses JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the link:{repoURL}/src/main/java/seedu/address/ui/MainWindow.java[`MainWindow`] is specified in link:{repoURL}/src/main/resources/view/MainWindow.fxml[`MainWindow.fxml`] +* *Listens for changes to Model data* so that the UI can be updated simultaneously. +** All Cards components and `CalenderPanel`, `ModuleListPanel`, `ProductivityPanel` and `TaskSummaryPanel` will listen to +the changes to Model data. -The `UI` component, +[NOTE] +The command execution will only terminate in two scenarios: + +1. When the command is successfully executed. + +2. When the user enter `quit` and kbd:[enter] to exit the execution. +//end::UIComponent[] -* Executes user commands using the `Logic` component. -* Listens for changes to `Model` data so that the UI can be updated with the modified data. +//updated by Teik Jun +//tag::logicComponent[] [[Design-Logic]] === Logic component [[fig-LogicClassDiagram]] .Structure of the Logic Component -image::LogicClassDiagram.png[] +image::LogicClassDiagram.png[width = "800" length = "500"] *API* : -link:{repoURL}/src/main/java/seedu/address/logic/Logic.java[`Logic.java`] +link:{repoURL}/blob/master/src/main/java/draganddrop/studybuddy/logic/Logic.java[`Logic.java`] + +. After receiving the user input from Ui, `InteractivePrompt` processes the user's input. +.. If the user input is complicated, `InteractivePrompt` uses `Parser` classes to +parse the input. +.. If more information is needed from the user, `InteractivePrompt` signals the `Ui` +component to prompt the user for more information using the `interact` command. +Otherwise, if no more information is needed, proceed to the next step. +. This results in a `Command` object which is executed by the `LogicManager`. +. The command execution can affect the `Model` (e.g. adding or editing a task). +. The result of the command execution is encapsulated as a `CommandResult` object which is passed back to the `Ui`. +. In addition, the `CommandResult` object can also instruct the `Ui` to perform certain actions, such as displaying a help message to the user. + +Given below is the Sequence Diagram for interactions within the `Logic` component for the `interact("list")` API call. + +image::ListTaskSequenceDiagram.png[width = "700", length = "600", title = "Sequence diagram for list"] + +[CAUTION] +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. + +//end::logicComponent[] -. `Logic` uses the `AddressBookParser` class to parse the user command. -. This results in a `Command` object which is executed by the `LogicManager`. -. The command execution can affect the `Model` (e.g. adding a person). -. The result of the command execution is encapsulated as a `CommandResult` object which is passed back to the `Ui`. -. In addition, the `CommandResult` object can also instruct the `Ui` to perform certain actions, such as displaying help to the user. -Given below is the Sequence Diagram for interactions within the `Logic` component for the `execute("delete 1")` API call. +//Given below is the Sequence Diagram for interactions within the `Logic` component for the `execute("delete 1")` API call. -.Interactions Inside the Logic Component for the `delete 1` Command -image::DeleteSequenceDiagram.png[] +//.Interactions Inside the Logic Component for the `delete 1` Command +//image::DeleteSequenceDiagram.png[] -NOTE: The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +//NOTE: The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +//updated by Souwmyaa +//tag::modelComponent[] [[Design-Model]] === Model component .Structure of the Model Component -image::ModelClassDiagram.png[] +image::ModelClassDiagram.png[width = "500", length = "500"] -*API* : link:{repoURL}/src/main/java/seedu/address/model/Model.java[`Model.java`] +*API* : link:{repoURL}/blob/master/src/main/java/draganddrop/studybuddy/model/Model.java[`Model.java`] The `Model`, * stores a `UserPref` object that represents the user's preferences. -* stores the Address Book data. -* exposes an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. +* stores the Study Buddy data. +* exposes an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. * does not depend on any of the other three components. - -[NOTE] -As a more OOP model, we can store a `Tag` list in `Address Book`, which `Person` can reference. This would allow `Address Book` to only require one `Tag` object per unique `Tag`, instead of each `Person` needing their own `Tag` object. An example of how such a model may look like is given below. + - + -image:BetterModelClassDiagram.png[] +//end::modelComponent[] [[Design-Storage]] === Storage component .Structure of the Storage Component -image::StorageClassDiagram.png[] +image::StorageClassDiagram.png[width="600", height="400"] -*API* : link:{repoURL}/src/main/java/seedu/address/storage/Storage.java[`Storage.java`] +*API* : link:{repoURL}/blob/master/src/main/java/draganddrop/studybuddy/storage/Storage.java[`Storage.java`] The `Storage` component, * can save `UserPref` objects in json format and read it back. -* can save the Address Book data in json format and read it back. +* can save the Study Buddy data in json format and read it back. +* saves all tasks, due soon tasks, archived task, modules and stats. [[Design-Commons]] === Common classes -Classes used by multiple components are in the `seedu.addressbook.commons` package. +Classes used by multiple components are in the `draganddrop.studybuddy.commons` package. == Implementation This section describes some noteworthy details on how certain features are implemented. -// tag::undoredo[] -=== [Proposed] Undo/Redo feature -==== Proposed Implementation +//tag::InteractiveCommandProcessFeature[] +=== Interactive Command Process Feature + +==== Implementation -The undo/redo mechanism is facilitated by `VersionedAddressBook`. -It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. -Additionally, it implements the following operations: +. *Feature introduction* ++ +The Interactive Command Process Feature allows user to execute his/her command in an +interactive way. -* `VersionedAddressBook#commit()` -- Saves the current address book state in its history. -* `VersionedAddressBook#undo()` -- Restores the previous address book state from its history. -* `VersionedAddressBook#redo()` -- Restores a previously undone address book state from its history. +. *Implementation detail* ++ +This feature applies on all commands provided by Study Buddy and is implemented using: -These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively. +.. The `*CommandBox*` from `UI` component to collect user input and init an associate interactivePrompt +.. The `*InteractivePrompt*` from `Logic` component to parse user input step by step and generate meaningful response +message accordingly. +It also produces an executable `Command` from each successful interaction to perform the user's desired action. +... Different types of `InteractivePrompt` such as `AddTaskInteractivePrompt` are provided to handel interactions with different purpose. ++ +image::AddTaskObjectDiagram.png[width = "550" align="center" title = "Object diagram when user add task using interactive command process"] ++ +... Allow user to quit from each step of an interaction using `quit` (case insensitive) key word. Here is an example of user quiting from add task interactive command process. ++ +image::QuitFromInteractionActivityDiagram.png[width = "550" align="center" title = "Activity diagram when user quite from add task interactive command process"] -Given below is an example usage scenario and how the undo/redo mechanism behaves at each step. +==== Example Usage Scenario +Given below is an example usage scenario and how the interactive command process mechanism behaves at each step. -Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state. +Step 1. The user launches the application for the first time and skips the user guid. +By following the hint from `UI` (i.e. when `CommandBox` is idle, it should display "Please enter your command here..."), +he can try some random input and hit enter to get the list of available commands. -image::UndoRedoState0.png[] +Step 2. The user picks a command from the list and type it in the `CommandBox`. The guide information of the next step will +display in `FeedbackDisplayBox` after user press enter. -Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state. +[NOTE] +For some commands there is only one interaction involved, such as `help` and `list`. In such a case +the application will execute the command right after user press enter. -image::UndoRedoState1.png[] +Step 3. The user made a typo mistake in the data and time filed when adding a task record. +Proper massage with the error type and the correct format of the data and time will be displayed in the +`FeedbackDisplayBox`. User can follow the instruction to continue the interaction. -Step 3. The user executes `add n/David ...` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`. +Step 4. The user is performing an interaction to edit a task, but realized he/she +chose a wrong task from the list, he/she can use `quit` to exit +the process without making any changes to the task. -image::UndoRedoState2.png[] +==== Design Considerations + +===== Aspect: How to react to an invalid input +* *Alternative 1 (current choice):* provides relevant error message and stays at current interaction step. ++ +** *If the next input is* ++ +- Invalid: provides the relevant error message and continue waiting for another input. +- Valid: start next interaction step. +- `quit`: quite from the command process. + +** Pros: Save the data from previous stages, especially in add task interaction, thus user no need to repeatedly +enter the same information. Also the clear instruction provided by error message makes the +interaction more straightforward. Besides, this approach can improve the typo-tolerance of the application. + +** Cons: The interaction can only be stopped when user successfully complete the process or use +`quit` to exit half-way. + +* **Alternative 2:** Quite from current step with proper error message. +** Pros: Quit the interaction immediately, which allows user to start with a new +interaction. It will be useful when user want to quit from a particular process but forgets the exit command +(i.e. `quit`). +** Cons: User has to restart the entire interaction process when the he/she enter +invalid command. +//end::InteractiveCommandProcessFeature[] + +// tag::dueSoon[] +=== Due Soon Tasks Feature + +==== Implementation + +The Due Soon Tasks feature allows users to view the tasks that have deadlines within the next week. + +This feature is implemented using a panel on the main window with a list of tasks Due Soon that is updated with every command that may affect Due Soon task list (such as add, delete or archive). + +Some situations that trigger due soon feature are: + +. *When user enters a task:* + +.. What it does: + +... When a task that is added to the main list, is due within the next week, it is automatically added to the list of due soon tasks. + +... The list is automatically sorted to be in increasing order of deadlines. + +... The time left for the deadline is also added. ++ +image::AddDueSoonActivityDiagram.png[width = "200", length = "300", title = "Activity Diagram for Add to Due Soon list"] +{bl} + +.. Details: + +... The add command when entered by the user, triggers the creation of an object of the InteractivePrompt class (in this case AddTaskInteractivePrompt). + +... In the AddTaskInteractivePrompt class, the data entered by user is parsed. + +... If there are no errors, the AddTaskCommand object is created which triggers the addTask() function in Model. + +... This function in turns calls addTask() function in Study Buddy. + +... This function calls the isDueSoon() function in Task to confirm if the task belong to the due soon list. + +... If it does, it is added to due soon list and main list, and the due soon list is sorted. Else, it is simply added to the main list. ++ +image::AddDueSoonSequence.png[width = "800", length = "600", title = "Sequence Diagram for Add to Due Soon list"] +{bl} +[CAUTION] +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +{bl} + +. *When user deletes a task:* + +.. What it does: +... When a task that is deleted from the main list occurs in the due soon list as well, it is automatically deleted. ++ +image::DeleteDueSoonActivityDiagram.png[width = "200", length = "300", title = "Activity Diagram for Delete from Due Soon list"] +{bl} +.. Details: +... The delete command when entered by the user, triggers the creation of an object of the InteractivePrompt class (in this case DeleteTaskInteractivePrompt). +... In the DeleteTaskInteractivePrompt class, the data entered by user is parsed. +... If there are no errors, the DeleteTaskCommand object is created which triggers the deleteTask() function in Model. +... This function in turns calls removeTask() function in Study Buddy. +... removeTask() calls the updateDeleteDueSoon() function in StudyBuddy which checks if the task exists in the due soon list. +... If it does, it is deleted from the due soon list and main list. Else, it is simply deleted from the main list. ++ +image::DeleteDueSoonSequence.png[width = "800", length = "600", title = "Sequence Diagram for Delete from Due Soon list"] +{bl} +[CAUTION] +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. [NOTE] -If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`. +Other commands like edit, archive etc also trigger due soon feature in a similar manner. -Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state. +. *When user refreshes due soon list:* -image::UndoRedoState3.png[] +.. What it does: + +... Refreshes the list of due soon tasks and status tags. This command is useful for a situation where due soon list is not up to date due to a drastic change in time. ++ +image::DueSoonActivityDiagram.png[width = "500", length = "600", title= "Activity diagram for refresh"] +{bl} +.. Details: +... The refresh command when entered by the user, triggers the creation of an object of the InteractivePrompt class (in this case RefreshTaskInteractivePrompt). +... In the RefreshTaskInteractivePrompt class, the data entered by user is parsed. +... If there are no errors, the RefreshCommand object is created which clears the due soon list and then, iterates through the main list and calls addDueSoonTask() in Model, for any tasks that are due soon. ++ +image::DueSoonSequenceDiagram.png[width = "800", length = "600", title = "Sequence diagram for refresh"] +{bl} +[CAUTION] +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. + +. *When the application launches:* + +.. What it does: +... It loads the due soon tasks into a panel by filtering tasks that are due soon from the main list. +... This is necessary, because old list of due soon tasks may not be up-to-date. + +.. Details: +... The addTask() function in StudyBuddy class already checks if task is due soon and adds to due soon list (as mentioned above). +... While all tasks are being added to their respective lists in JsonSerializableStudyBuddy class, the due soon list gets automatically updated. [NOTE] -If the `currentStatePointer` is at index 0, pointing to the initial address book state, then there are no previous address book states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the undo. +Calculation of time left for deadline and check for if task is due soon can be found in the Task class. +//end::dueSoon[] + +==== Example Usage Scenario +Given below is an example usage scenario and how the Due Soon list mechanism behaves at each step. + +Step 1. The user launches the application for the first time. + +The list of tasks Due Soon will be initialized and displayed with the initial study buddy state. Initialization is done by filtering tasks that are Due Soon from the general list of tasks. + +Step 2. The user executes `add` command to add a task. +The `add` command execution checks if this task belongs in the Due Soon tasks list (i.e it is due in 7 days). If it does, the task is added to both lists, else it is only added to the main list. + + +Step 3. The user executes `delete` command to delete a task. +The `delete` command execution also checks if this task exists in the Due Soon task list. If it does, task is deleted from both lists, else it is only deleted from the main list. + +Step 4. The user executes `refresh` command to refresh the due soon task list. +The `refresh` command execution will traverse the main list and check if there are any inconsistencies. For example, if there has been a change in time and a task is missing from the due soon task list, it will be added. +It will also update the time left. + +[NOTE] +If there are no such inconsistencies, the refresh command will not make any changes to the Due Soon task list. + +//tag::refresh[] +==== Design Considerations + +===== Aspect: How `refresh` command works + +* **Alternative 1 (current choice):** Clear and reload the due soon task list. +** Pros: Less prone to errors since the entire list is "refreshed". +** Cons: More operation intensive. +* **Alternative 2:** Does not clear and reload the due soon task list. +** Pros: Fewer operations need to be performed. +** Cons: May have be more prone to errors because list is not completely "refreshed". Some parts of it are the same. +// end::refresh[] -The following sequence diagram shows how the undo operation works: +//tag::taskSummary[] +=== Task Summary Feature -image::UndoSequenceDiagram.png[] +==== Implementation -NOTE: The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +. *Feature introduction* ++ +The task summary feature automatically summarizes the collected data into different charts. +It also allows the user to click on a chart to find the relevant tasks. +The UI of the feature is in the `Statistics` Page. +. *Implementation detail* ++ +This feature is implemented using `JavaFx` charts such as `PieChart`, `AreaChart` and `StackedBarChart`, as well as a +`Task List Panel`. ++ +The `Task List Panel` is used to show the relevant task records when the user clicks on `charts`. + + +. *Table of Charts & DataBind & OnClick Action* ++ -The `redo` command does the opposite -- it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state. +[TIP] +To improve the readability, only the tasks due or start within the next *60 days* will be counted into `Area Chart`. ++ +[cols="3,2,3",options="header"] +|=== +|Chart Type |Data Used|OnClick Action + +|*PieChart* + +{bl} +Compare the number of tasks in different statuses. +|{bl} +`TaskStatus`, `TaskCount` +|Display all tasks with the selected status. + +|*AreaChar* + +{bl} +Summarize the task deadlines or start dates for different modules. +|{bl} +`ModuleCode`, `Deadline/Start date`, + + `TaskCount` +|*Click on area*: + +Display tasks under the selected module. + +{bl} +*Click on data point*: + +Display tasks under the selected module and will due or start the chosen date. + +|*StackedBar Chart* + +{bl} +Compare the weight of different types of tasks in each module. +|{bl} +`ModuleCode`, `TaskType`, `WeightSum` +|Display tasks under the selected module and type. + +|=== ++ +image::TaskSummaryOnClickActivityDiagram.png[width = "650" align="center" title = "Sequence diagram for task summary UI update when data change"] +. *OnChangeListener* ++ +The feature listens to the change of `Model's` `UnArchived Task Records`, `Archived Task Records` and `Module Records`. ++ +Once a change is captured, the charts will automatically re-render to show the latest statistics. ++ +Currently, commands as `add` `edit` `delete` `sort` `find` `archive` `done` `list` `clear` etc. can +trigger the refresh of the charts. ++ +image::TaskSummaryOnDataChangeSequenceDiagram.png[width = "800" align="center" title = "Sequence diagram for task summary UI update when data change"] ++ [NOTE] -If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone address book states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo. +It is possible that the labels of charts can overlap together. +This is an unfixed bug regarding the JDK which is caused by JavaFX chart off-sync. To get more information, you may refer to link:{jdk_bug_report}[here]. +When this issue happens, you can use any command that can trigger chart updating to refresh. + +==== Example Usage Scenario +Given below is an example usage scenario and how the task summary mechanism behaves at each step. -Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged. +Step 1. The user launches the application for the first time, the statistics will perform on top of the sample records, +and the result will be visualized into different charts organized in the `Tab Panel`. After the user clicks `Statistics` +from the top menu bar, the `Tab Panel` and the `Task List Panel` will display. -image::UndoRedoState4.png[] +Step 2. The user navigates to the `Statistics` Page for the first time. The `Tab Panel` should +display the `Pie Chart` and the `Task List Panel` is empty with a title: "Click on Chart to View Related Tasks". +Indeed, this is how the `Statistics` Page looks like every time the user navigates back from another Page. -Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. We designed it this way because it no longer makes sense to redo the `add n/David ...` command. This is the behavior that most modern desktop applications follow. +Step 3. The user clicks on `Pie Chart` 's `Pending` portion. All tasks in `Pending` status should display in `Task List Panel`. +Meanwhile, the title of the Panel will change to "PENDING: # Tasks" (# stands for the number of `Pending` tasks). -image::UndoRedoState5.png[] +Step 4. The user clicks on `Area Chart` 's `CS2101` area. All tasks under `CS2101` should display in `Task List Panel`. +Meanwhile, the title of the Panel will change to "Tasks under CS2101". -The following activity diagram summarizes what happens when a user executes a new command: +Step 5. The user executes `add` command at `Statistics` Page, +the charts should update automatically. -image::CommitActivityDiagram.png[] +Step 6. The user executes `done` command at another page, and navigate back to `Statistics` Page +the charts should show the latest statistics. ==== Design Considerations +===== Aspect: Will this feature contribute value to CLI user +Consideration:: +Task Summary feature involves mouse clicking event when user retrieving relevant tasks. ++ +Explanation:: +The Task Summary Feature provides tow main services: + 1. The *automatic statistics* of the user input (i.e. the tasks and modules information). + 2. The relevant *records retrieving*. + ++ +The retrieving service is built on top of the statistics result. +Meanwhile, the statistics is auto-generated along the way the user managing their records using *keyboard input*. + +Therefore, this feature can make a fast typist be more productive, especially when Study Buddy primarily +supports the CLI. + +===== Aspect: How to update charts +* **Alternative 1 (current choice):** Use `onChangeListener` to monitor the data update and re-render the UI simultaneously. +** Pros: More user-friendly, no need to ask user to manually update. +** Cons: Might encounter JavaFX chart off-sync bug, and results in label overlapping. But user can always use another +command which can trigger data updating to walk around this problem. +* **Alternative 2:** Trigger the UI rendering by asking the user to re-launch the application or navigate away and back to the page. +** Pros: Safe from the JavaFX chart off-sync bug. +** Cons: Force user to close or navigate around the application every time he/she wants to +check the updated charts. +// end::taskSummary[] + +//tag::calendar[] +=== Calendar feature + +==== Implementation +The calendar feature displays a calendar for users. + +The feature is implemented by overriding the task list display panel on the main window with calendar box. The calendar currently supports following features: + +. Displays the name of all tasks on that day in the calendar grid. +. Access calendars in previous or next month using the buttons on top. +. Displays more information about tasks for the day on the Due Soon panel after clicking on a grid. +. Fast forward to a specific year/month using CLI. -===== Aspect: How undo & redo executes +When a calender is requested, a CalendarPanel object is constructed, the object diagram below shows the structure of a CalendarPanel. We will be using the date `01/04/2020` as an example. -* **Alternative 1 (current choice):** Saves the entire address book. -** Pros: Easy to implement. -** Cons: May have performance issues in terms of memory usage. -* **Alternative 2:** Individual command knows how to undo/redo by itself. -** Pros: Will use less memory (e.g. for `delete`, just save the person being deleted). -** Cons: We must ensure that the implementation of each individual command are correct. +image::CalendarBoxObjectDiagram.png[title="CalendarPanel object diagram"] -===== Aspect: Data structure to support the undo/redo commands +Tasks shown in `calendar` will automatically be updated upon using any of the following commands: -* **Alternative 1 (current choice):** Use a list to store the history of address book states. -** Pros: Easy for new Computer Science student undergraduates to understand, who are likely to be the new incoming developers of our project. -** Cons: Logic is duplicated twice. For example, when a new command is executed, we must remember to update both `HistoryManager` and `VersionedAddressBook`. -* **Alternative 2:** Use `HistoryManager` for undo/redo -** Pros: We do not need to maintain a separate list, and just reuse what is already in the codebase. -** Cons: Requires dealing with commands that have already been undone: We must remember to skip these commands. Violates Single Responsibility Principle and Separation of Concerns as `HistoryManager` now needs to do two different things. -// end::undoredo[] +* `add` +* `delete` +* `archive` +* `unarchive` +* Any other commands that modifies the task list -// tag::dataencryption[] -=== [Proposed] Data Encryption +==== Example usage scenarios -_{Explain here how the data encryption feature will be implemented}_ +===== Using mouse click +Clicking on the show calendar menu item under the calendar menu will enable this feature. Upon requesting for the calendar to be shown: + +. The calendar box object will be constructed +. The calendar loops through every day of the month while searching for tasks due on that day +. The task name is added to the calendar grid + +===== Using CLI +As of Study Buddy v1.4, a new feature has been added that allows users to navigate the calendar using CLI. + +. The user enters 'calendar' into the command box. +. The user enters the selected date into the command box. +. Calendar will be generated the same way as a mouse click, however, it will use the entered date as parameters. + +It is implemented by getting the latest instance of `MainWindow` and directly changing the UI by calling `handleShowCalendar()`. + +Below is an activity diagram describing the events that will happen: + +image::CalendarActivityDiagram.png[width = "400", length = "600" title = "Calendar Activity Diagram"] + +==== Design considerations +* It is more efficient to cache the calendar rather than to generate a new one, however, we do not expect the user to have too many tasks and therefore it should not slow down the application. +* The implementation used for CLI involves a static method in MainWindow which might be unsafe, however, it was the best choice given the time constraints. +//end::calendar[] + +//tag::archive[] +=== Archive feature +Archive stores selected task away into a separate task list, this command is used when the user has completed a task but still wants to keep track of it. + +==== Implementation +Archive uses a new archive command. Upon executing the archive command, it will call the model to delete the task and archive it +into another list stored within model. + +[NOTE] +The index for archived tasks are not used for any commands other than `unarchive`. + +Sequence diagram: + +image::ArchiveSequenceDiagram.png[width = "600", length = "500" title = "Archive Sequence Diagram"] +[CAUTION] +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. + +==== Design consideration +There were two possible ways to store archived tasks: + +. Store it as a separate list +. Add another field to task to keep track of its archived state + +The first choice was chosen as it speeds up the runtime. Also, it makes it easier to manage the indexes. +//end::archive[] + +//tag::productivity[] +=== Productivity feature + +==== Implementation +The productivity feature displays insights related to the user's productivity over the +past day, week and more on the Productivity panel. +The Productivity page is integrated with the main page as a side panel. + +The Productivity page is further composed of 3 tabs: + +. Daily Productivity Tab + +. Weekly Productivity Tab + +. Productivity Points Tab + +The Productivity page can be viewed by clicking on the Productivity menu item, +which directs the user to the Daily Productivity Tab. +The Productivity page can also be viewed by clicking on the Productivity Points shown on +the top right of the application window. +This directs the user to the Productivity Points Tab. + +The productivity feature is facilitated by the `Statistics` class, which allows +StudyBuddy to keep track of relevant usage statistics of the user. +`Statistics` is further composed of classes that keep track of specific statistics: + +.. `CompletionStats` keeps track of the number of tasks completed by the user each day and each week + +.. `OverdueStats` keeps track of the number of tasks that went overdue each day and each week. + +.. `ScoreStats` keeps track of the user's Productivity Points and rank each day + +.. `GeneralStats` keeps track of the user's goal, streak, and other statistics not covered by the other statistics classes + +The object diagram for the Productivity feature is shown below: + + +image::ProductivityObjectDiagram.png[width = 900 title="Productivity object diagram"] + +The Productivity feature displays the Producitivity Points of the user, this is recorded in `currentScore` +and `scoreList` attributes in `ScoreStats` class. + +The user can gain or lose Productivity Points in StudyBuddy when certain actions or events are completed. +These include: + +.. Adding a task: _+1_ + +.. Completing a task: _+10_ + +.. Completing your daily goal: _+(points equivalent to daily goal)_ + +.. Using advanced features; _+1_ + +.. Letting a task go Overdue: _-1_ + +Each usage statistic is updated accordingly when the respective user action or event +has concluded. These statistics are then rendered on the `ProductivityPanel`. +The chart visualizations are implemented using `ProgressIndicator`, `BarChart` and `AreaChart`. + +When the statistics are updated, the task list's event listener and classes implementing +`GoalObserver` will be informed of the changes. `ProductivityPanel` re-renders the +displayed information when either of these are updated. + +The data displayed will be automatically updated upon calling any of the following commands: + +* `add` + +* `done` + +* `delete` + +* `refresh` + +* `goal` + +* Any command that modifies the task list + +==== Example Use Scenario +Given below is an example usage scenario and how the +Productivity feature behaves at each step. + +Step 1: The user launches the application. +Step 2: The Productivity feature displays the user's Productivity Points on the top right of the screen. +Step 3: The user clicks the Productivity Menu button +Step 4: The Daily Productivity Tab is displayed to the user +Step 5: The user completes a task using `done` +Step 6: The daily number of tasks is added and Productivity Points is increased. +If the daily goal has been reached, the user's streak is incremented. + +Here is an activity diagram of the aforementioned steps: + +image::ProductivityActivityDiagram.png[width = "400", length = "500" title = "Productivity Feature Example Activity Diagram"] + +Extension: Suppose the user sees the Productivity Points and clicks it +Step 3: The user clicks the Productivity Points on the top right of the screen +Step 4: The Productivity Points Tab is displayed to the user + +From here, the user can continue to manage tasks as per Step 5 and 6 above, +or navigate to other Productivity tabs. + + +==== Design Considerations + +===== Aspect: How to re-render Productivity Panel when statistics are updated +*Alternative 1*: re-render only the values that have been updated + +- Pros: maximizes loading speed and minimizes lag for the user + +- Cons: increases complexity for codebase, higher chance of bugs occuring + +*Alternative 2*: always re-render the whole Productivity Panel + +- Pros: easy to implement + +- Cons: may result in slower loading speed and more lag for the user + +*Alternative 3 (current choice)*: re-render only the values that have been updated +if it does not result in increased code complexity + +- Pros: improves loading speed and decreases lag for the user, +while keeping the codebase readable and easy to reason with. + +- Cons: may result in slower loading speed. However, based on testing, +this trade-off does not result in any measurable delay. + +//As far as feasible, the productivity feature re-renders only the values that +//have been updated. This improves the loading speed and minimizes lag for the user. +//However, in some cases, this will lead to more complicated code to reason with. +//As such, the productivity feature sometimes re-renders more values than necessary. +//Based on testing, this trade-off made by the productivity feature does not result +//in any measurable delay. + +//end::productivity[] + +//tag::mod[] +=== Modules +(Contributed by Hong Wen) +The `modules` feature enables users to be able to group and view their tasks according to various modules or subjects. +Each module is assigned with a unique module code & a name. +By default, all task created with the `add` command will be be assigned to module code `OO0000O`. + +==== Implementation +Modules are created with `create mods` Command and the program will request for a module name and module code. There are no restrictions on module name as long as it is not an empty entry. + +Module codes however, require at least an alphabetical prefix, a number, and a postfix(optional). + +``` +Correct moduleCodes: +A0A +CS11X +AA1234 + +Incorrect moduleCodes: +123456 +CAT +555T +``` + +==== Sequence diagram for creating modules +This is a sequence of how a module is created using the `create mods` feature. Take note that all interactions go through the `CommandBox` first in the UI, but it will be omitted from this diagram for simplicity. + +image::ModuleSequenceDiagram.png[width = "1000", length = "800", title= "Sequence diagram for modules"] +1. When the user keys in `create mods` or click *Module/create* on the menu bar, +a `CreateModuleInteractivePrompt` class is created. It automatically constructs an `EmptyModule`. + +2. The interactivePrompt class will then change module attributes such as +name and `ModuleCode` on according to user input. + +3. At the last stage, the prompt will construct a `CreateModCommand` for execution. +It will go through the various layers in Model before returning to the prompt, +which will then return to the user. + +{bl} +[CAUTION] +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +{bl} + +//end::mod[] -// end::dataencryption[] === Logging -We are using `java.util.logging` package for logging. The `LogsCenter` class is used to manage the logging levels and logging destinations. +We are using `java.util.logging` package for logging. +The `LogsCenter` class is used to manage the logging levels and logging destinations. * The logging level can be controlled using the `logLevel` setting in the configuration file (See <>) * The `Logger` for a class can be obtained using `LogsCenter.getLogger(Class)` which will log messages according to the specified logging level @@ -262,6 +823,36 @@ We are using `java.util.logging` package for logging. The `LogsCenter` class is Certain properties of the application can be controlled (e.g user prefs file location, logging level) through the configuration file (default: `config.json`). +//tag::dataencryption[] +=== [Proposed] Data encryption + +Since Study Buddy is an offline application, there is no threat of being attacked via a network channel. However, in case the computer has a shared owner, a password feature can be implemented in the future for privacy purposes. + +==== Implementation +The goal is to encrypt `taskList3.json`, while still allowing the owner to access his/her tasks using his password. + +We will be using AES (Advanced Encryption Scheme) for encryption, and a slow hashing algorithm to derive a key from the user's password. The slow hashing algorithm is to prevent brute force attacks. + +======= +*Encryption* + +. User sets a password. (Optional) +. Study Buddy uses a slow hashing algorithm (https://github.com/patrickfav/bcrypt[bCrypt]) to generate a key. +. When user exits the app, Study Buddy will encrypt taskList.json using the https://github.com/facebookarchive/conceal[conceal] library and the generated key. +. TaskList.json should now be encrypted +======= +======= +*Decryption* + +. User enters a password. +. If the password is correct, the same key should be hashed and taskList.json can be decrypted. +. If the password is incorrect, user will be allowed to try again. +======= + +We leave it to the user's own jurisdiction to create a strong password. +//end::dataencryption[] + + == Documentation Refer to the guide <>. @@ -279,104 +870,390 @@ Refer to the guide <>. *Target user profile*: -* has a need to manage a significant number of contacts -* prefer desktop apps over other types +* has a need to manage a significant number of tasks for various modules +* appreciates visualization tools to aid in task management +* prefers desktop apps over mobile apps * can type fast * prefers typing over mouse input -* is reasonably comfortable using CLI apps -*Value proposition*: manage contacts faster than a typical mouse/GUI driven app +*Value proposition*: + +* manages tasks faster than a typical mouse/<> driven app +* uses interactive prompt to enhance user experience +//updated by Souwmyaa +//tag::userStories[] [appendix] == User Stories Priorities: High (must have) - `* * \*`, Medium (nice to have) - `* \*`, Low (unlikely to have) - `*` -[width="59%",cols="22%,<23%,<25%,<30%",options="header",] +[cols="1,1,3,3",options="header"] |======================================================================= |Priority |As a ... |I want to ... |So that I can... |`* * *` |new user |see usage instructions |refer to instructions when I forget how to use the App -|`* * *` |user |add a new person | +|`* * *` |user |view a list of my tasks | know what I have Pending -|`* * *` |user |delete a person |remove entries that I no longer need +|`* * *` |user |add a new task | view all my tasks in one place -|`* * *` |user |find a person by name |locate details of persons without having to go through the entire list +|`* * *` |user |delete a task |remove entries that I no longer need -|`* *` |user |hide <> by default |minimize chance of someone else seeing them by accident +|`* * *` |user |mark a task as completed| update my list of Pending tasks -|`*` |user with many persons in the address book |sort persons by name |locate a person easily -|======================================================================= +|`* * *` |user |find a task by keyword |locate details of a task without having to go through the entire list + +|`* *` |user with many deadlines |sort tasks in order of deadlines |organise my list by priority + +|`* *` |user |archive tasks |separate the tasks that are not applicable right now + +|`* *` |user |view renamed tasks | easily filter out any renamed data in my list + +|`* *` |user |filter all pending tasks | view all my Pending tasks in one place -_{More to be added}_ +|`* *` |user who likes organization |view all my tasks that are Due Soon|know what to focus on in the next week + +|`* *` |user who makes typos |be able to edit a task I have added|correct any typos I have made + +|`* *` |user who is forgetful |have an interactive command prompt|not have to remember long commands + +|`* *` |user who is starting a new semester |clear all my tasks|start adding on to an empty list + +|`* *` |user who takes many modules |add my modules |view my modules + +|`* *` |user who finds it hard to keep track of all my deadlines| have a calendar| easily find tasks due on a day +//end::userStories[] + +|`* *` |user who is stressed out by all my deadlines| have a fun todolist| have fun while completing my tasks + +|`* *` |user who wants to be more productive | have an overview of my task completed this week| monitor my progress + + +//tag::userStoriesYuting[] +|`* *` |user who is forgetful| have a clear instruction every time I made mistake in command | play with the application more fluently + +|`* *` |user whose deadline of a task is extended | edit the particular task | update my task accordingly + +|`* *` |user who is lazy | set daily goal | force myself to study + +|`* *` |user who lacks of motivation | get award by completing task | be motivated + +|`* *` |user who has many tasks | check the summary of their current status in one place | do my future plan easily + +|`* *` |user who has many modules | view all tasks under a particular module | focus on this module + +|`* *` |user who has many modules and tasks | check the summary of task deadlines under different modules | understand which module need to study first + +|`* *` |user who has many modules and tasks | check the summary of task weights under different modules | understand which assessment should pay more attention to + +|`* *` |user who likes multitasking| adjust the application's window size | fit it with other windows +//end::userStoriesYuting[] +|======================================================================= [appendix] == Use Cases -(For all use cases below, the *System* is the `AddressBook` and the *Actor* is the `user`, unless specified otherwise) +(For all use cases below, the *System* is `Study Buddy` and the *Actor* is the `user`, unless specified otherwise) + + +//tag::useCasesYuting[] +[discrete] +=== Use case: Add a new task + +*MSS* + +1. User requests to add a new task. +2. Study Buddy requests user to choose module from available module list. +3. User chooses module. +4. Study Buddy requests for task name. +5. User provides task name. +6. Study Buddy requests user to choose task type from available task type list. +7. User provides task type. +8. Study Buddy requests for task description. +9. User provides task description. +10. Study Buddy requests for task weight. +11. User provides task weight. +12. Study Buddy requests for estimated cost of time for this task. +13. User provides estimated time cost for this task. +14. Study Buddy requests for confirmation. +15. User confirms. +16. Study Buddy inserts the new task to user's task list. ++ +Use case ends. + +*Extensions* + +[none] +* 3a. User can press enter to skip. ++ +[none] +** Use case resumes at step 4. + +* 3b. +The given index is invalid. ++ +[none] +** 3b1. Study Buddy shows an error message. ++ +Use case resumes at step 3. +* 3c. +The given module code is invalid. ++ +[none] +** 3c1. Study Buddy shows an error message. ++ +Use case resumes at step 3. +[none] +* 5a. +The length of given task name exceeds 20 characters. ++ +[none] +** 5a1. Study Buddy shows an error message. ++ +Use case resumes at step 5. +* 7a. +The given index is invalid. ++ +[none] +** 7a1. Study Buddy shows an error message. ++ +Use case resumes at step 7. +* 9a. +User can press enter to skip. ++ +[none] +** Use case resumes at step 10. ++ +* 9b. +The length of given task description exceeds 300 characters. ++ +[none] +** 9b1. Study Buddy shows an error message. ++ +Use case resumes at step 9. +* 11a. +User can press enter to skip. ++ +[none] +** Use case resumes at step 12. ++ +* 11b. +The given weight is invalid. ++ +[none] +** 11b1. Study Buddy shows an error message. ++ +Use case resumes at step 11. +* 13a. +User can press enter to skip. ++ +[none] +** Use case resumes at step 14. + +* 13b. +The given estimated cost of time is invalid. ++ +[none] +** 13b1. Study Buddy shows an error message. ++ +Use case resumes at step 13. +* a. At any time, user enters quit and press enter to exit the interaction. ++ +Use case ends. + +[discrete] +=== Use case: Edit task's weight + +*MSS* + +1. User requests to edit a specific task in the list +2. Study Buddy asks for the index +3. User provides index +4. Study Buddy asks for the index of the field that he/she wish to edit for the task +5. User selects index of Task weight +6. Study Buddy asks for the new weight +7. User provides the new weight +8. Study Buddy updates the selected tasks weight to the new value ++ +Use case ends. + +*Extensions* +[none] +* 3a. +The given index is invalid. ++ +[none] +** 3a1. Study Buddy shows an error message. ++ +Use case resumes at step 3. +* 7a. +The given weight is invalid. ++ +[none] +** 7a1. Study Buddy shows an error message. ++ +Use case resumes at step 7. +* a. At any time, user enters quit and press enter to exit the interaction. ++ +Use case ends. +//end::useCasesYuting[] + + + +//updated by Souwmyaa +//tag::useCasesSouwmyaa[] +[discrete] +=== Use case: List task + +*MSS* + +1. User is on the `All tasks` or `productivity` tab. +2. User requests to list tasks +3. Study Buddy shows a list of unarchived tasks ++ +Use case ends. [discrete] -=== Use case: Delete person +=== Use case: Delete task *MSS* -1. User requests to list persons -2. AddressBook shows a list of persons -3. User requests to delete a specific person in the list -4. AddressBook deletes the person +1. Refer to List task use case +2. User requests to delete a specific task in the list +3. Study Buddy asks for the index +4. User provides index +5. Study Buddy deletes the task + Use case ends. *Extensions* [none] -* 2a. The list is empty. +* 4a. +The given index is invalid. ++ +[none] +** 4a1. Study Buddy shows an error message. ++ +Use case resumes at step 3. + +[discrete] +=== Use case: Filter tasks + +*MSS* + + +1. User requests to filter tasks +2. Study Buddy shows two options for filter +3. User requests to filter by status +4. Study Buddy provides options to filter by status +5. User provides input +6. Study Buddy shows filtered task list + Use case ends. -* 3a. The given index is invalid. +*Extensions* + +[none] +* 3a. +The given index is invalid. + [none] -** 3a1. AddressBook shows an error message. +** 3a1. Study Buddy shows an error message. + Use case resumes at step 2. -_{More to be added}_ +[none] +* 3a. +User chooses to filter by type. ++ +[none] +** 4a. Study Buddy provides options to filter by type ++ +Use case resumes at step 5. -[appendix] -== Non Functional Requirements -. Should work on any <> as long as it has Java `11` or above installed. -. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage. -. 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. +[discrete] +=== Use case: View renamed -_{More to be added}_ +*MSS* -[appendix] -== Glossary +1. User requests to view renamed tasks +2. Study Buddy shows a list of renamed tasks ++ +Use case ends. -[[mainstream-os]] Mainstream OS:: -Windows, Linux, Unix, OS-X +*Extensions* + +[none] +* 1a. +There are no duplicate tasks +[none] +** 1a1. Study Buddy shows an empty list ++ +Use case ends. -[[private-contact-detail]] Private contact detail:: -A contact detail that is not meant to be shared with others +[discrete] +=== Use case: Refresh -[appendix] -== Product Survey +*MSS* + + +1. User notices Due Soon list needs to be updated +2. User requests to refresh +3. Study Buddy refreshes the Due Soon list and status tags ++ +Use case ends. + +*Extensions* + +[none] +* 2a. +The list is empty. ++ +[none] +** 2a1. List remains the same ++ +Use case ends. -*Product Name* +[none] +* 2b. +There is nothing to refresh ++ +[none] +** 2b1. List remains the same ++ +Use case ends. +//end::useCasesSouwmyaa[] -Author: ... +[appendix] +== Non Functional Requirements -Pros: +. Should work on any <> as long as it has Java `11` or above installed. +. Should come with automated unit tests and open source code. +. Should work on both 32-bit and 64-bit environments. +. Should be able to hold up to 1000 tasks without a noticeable sluggishness in performance for typical usage. +. 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. -* ... -* ... -Cons: +[appendix] +== Glossary -* ... -* ... +[[mainstream-os]] +Mainstream OS:: +Windows, Linux, Unix, OS-X +[[GUI]] +GUI:: +Graphical User Interface i.e a user interface that allows users to interact using graphical icons rather than text-based user interfaces +[[Index]] +Index:: +The index of a task refers to the sequence number of a task in the dashboard +[[CLI]] +CLI:: +Command Line Interface i.e a text base interface +[[AB3]] +AB3:: +Address Book Version 3 - the code base that Study Buddy is built upon [appendix] == Instructions for Manual Testing @@ -392,34 +1269,140 @@ These instructions only provide a starting point for testers to work on; testers .. Download the jar file and copy into an empty folder .. Double-click the jar file + - Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. + Expected: Shows the <> with a set of sample tasks. +The window size may not be optimum. . Saving window preferences -.. Resize the window to an optimum size. Move the window to a different location. Close the window. +.. Resize the window to an optimum size. +Move the window to a different location. +Close the window. .. Re-launch the app by double-clicking the jar file. + Expected: The most recent window size and location is retained. -_{ more test cases ... }_ +//updated by Souwmyaa +=== Deleting a task + +. Deleting a task while all tasks are listed + +.. Prerequisites: +... List all tasks using the `list` command. +... Multiple tasks in the list. + +.. Test case: `delete [Enter]` + `1` + + Expected: First task is deleted from the list. +Successful deletion indication in the status message. + +.. Test case: `delete [Enter]` + `0` + + Expected: No task is deleted. +Error details shown in the status message. +.. Other incorrect delete commands to try: `delete x`(where x is anything) + +//updated by Souwmyaa +=== Refreshing the due soon list + +. Refreshing the due soon list when the time left is off + +.. Prerequisites: +... Have some tasks in the due soon list +... Change the time of your PC to a time in the past/future + +.. Test case: Use the `refresh` command + + Expected: All the tags with time left now show updated time. +Successful refresh indication in the status message. + +//updated by Souwmyaa +=== Adding a duplicate task + +. Adding a duplicate task to the list + +.. Prerequisites: +... Have at least one task in the unarchived tasks list + +.. Test case: Use the `add` command to add a duplicate of an existing task + + Expected: It will add this duplicate task and append (1) at the end of its name. + +Successful add indication in the status message. -=== Deleting a person +//updated by Souwmyaa +=== Filter tasks -. Deleting a person while all persons are listed +. Filters tasks by status or type -.. Prerequisites: List all persons using the `list` command. Multiple persons in the list. -.. Test case: `delete 1` + - Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated. -.. Test case: `delete 0` + - Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. -.. Other incorrect delete commands to try: `delete`, `delete x` (where x is larger than the list size) _{give more}_ + - Expected: Similar to previous. +.. Prerequisites: +... Have a few tasks in the unarchived tasks list of different types and status' -_{ more test cases ... }_ +.. Test case: Use the `filter` command to filter by 'status' -> 'pending' + + Expected: It will filter all your pending tasks in the list. + +Successful filter indication in the status message. +//updated by Souwmyaa +=== Clear tasks + +. Clears all tasks in the study buddy + +.. Prerequisites: +... Have a few tasks in the unarchived tasks list + +.. Test case: Use the `clear` command + + Expected: It will clear everything in Study Buddy. + +Successful clear indication in the status message. + + +//updated by Souwmyaa +=== View renamed + +. Filters all tasks in your list with a number appended in brackets (auto-renamed) + +.. Prerequisites: +... Have a few duplicated tasks in the unarchived tasks list + +.. Test case: Use the `View renamed` command + + Expected: It filters all the auto-renamed tasks out. + +Successful filter indication in the status message. + +//updated by Souwmyaa +=== Exit + +. Exits from the application + +.. Prerequisites: +... Launch the application + +.. Test case: Use the `bye` command + + Expected: It exits the application. + +//updated by Souwmyaa +//tag::savingData[] === Saving data . Dealing with missing/corrupted data files -.. _{explain how to simulate a missing/corrupted file and the expected behavior}_ +.. Prerequisites: Delete the "tasklist.json" file from data folder. + +.. Test case: Launch the application + + Expected: The application indicates that the data file needed is missing and creates one. +c +.. Prerequisites: Modify the "tasklist.json" file to show some incorrect data. + +.. Test case: Launch the application + + Expected: The application indicates that the data file is corrupted. +Application launches successfully but has no data. +//end::savingData[] + +[appendix] +== Effort + +*Interactive prompt* + +* <> requires users to input a whole line of text at once, which is unintuitive and prone to typos by the user. + +* Furthermore, <> uses tags like "`\p`" to break the user's input up for parsing. This means that users will not be able to use these strings for any of their inputs. + +* Study buddy fixes that issue by introducing an interactive prompt for every command. This required a lot effort as there had to be an interactive prompt +for every command. + +*Refactoring* + +* While <> uses the `Person` class which had 5 fields, Study buddy uses the `Task` class that has 12 fields and every one of them is used in a major feature. -_{ more test cases ... }_ +* The <> has seen a major revamp, with 5 different tabs as well as some sub-tabs. diff --git a/docs/DeveloperGuide.html b/docs/DeveloperGuide.html new file mode 100644 index 00000000000..7dd879d1859 --- /dev/null +++ b/docs/DeveloperGuide.html @@ -0,0 +1,2740 @@ + + + + + + + +Study Buddy - Developer Guide + + + + + +
+ +
+

1. Introduction

+
+
+

Study Buddy is a task-management tool made for students who want to be able to track and manage their tasks in one place.

+
+
+

Study Buddy uses various visualization tools such as pie charts and calendars, provides useful functionality such as archive, Due Soon task list etc to make task management simple and convenient.

+
+
+

In particular, Study Buddy is a Command Line Interface (CLI) application that also provides some Graphical User Interface (GUI). This means that users are expected to interact with the Study Buddy mainly through the command line, but each command executed will evoke a visual response as well.

+
+
+

The purpose of this guide is to help potential developers get up to speed on the Study Buddy code base and functionality. We hope that this document will ease the process of further enhancing and developing Study Buddy.

+
+
+
+
+

2. Setting up

+
+
+

Refer to the guide here.

+
+
+
+
+

3. Commonly Used Symbols

+
+
+ + + + + +
+
Note
+
+This symbol indicates something you should take note of. +
+
+
+ + + + + +
+
Tip
+
+This symbol indicates a tip that you could use. +
+
+
+ + + + + +
+
Caution
+
+This symbol indicates an aspect that should be used with caution. +
+
+
+ + + + + +
+
Important
+
+This symbol indicates something to which we want to draw your attention. +
+
+
+
+
+

4. Design

+
+
+

4.1. Architecture

+
+
+ArchitectureDiagram +
+
Figure 1. Architecture Diagram
+
+
+

The Architecture Diagram given above explains the high-level design of the App. +Given below is a quick overview of each component.

+
+
+ + + + + +
+
Tip
+
+The .puml files used to create diagrams in this document can be found in the diagrams folder. +Refer to the Using PlantUML guide to learn how to create and edit diagrams. +
+
+
+

Main has two classes called Main and MainApp. +It is responsible for,

+
+
+
    +
  • +

    At app launch: Initializes the components in the correct sequence, and connects them up with each other.

    +
  • +
  • +

    At shut down: Shuts down the components and invokes cleanup method where necessary.

    +
  • +
+
+
+

Commons represents a collection of classes used by multiple other components. +The following class plays an important role at the architecture level:

+
+
+
    +
  • +

    LogsCenter : Used by many classes to write log messages to the App’s log file.

    +
  • +
+
+
+

The rest of the App consists of four components.

+
+
+
    +
  • +

    UI: The UI of the App.

    +
  • +
  • +

    Logic: The command executor.

    +
  • +
  • +

    Model: Holds the data of the App in-memory.

    +
  • +
  • +

    Storage: Reads data from, and writes data to, the hard disk.

    +
  • +
+
+
+

Each of the four components

+
+
+
    +
  • +

    Defines its API in an interface with the same name as the Component.

    +
  • +
  • +

    Exposes its functionality using a {Component Name}Manager class.

    +
  • +
+
+
+

For example, the Logic component (see the class diagram given below) defines it’s API in the Logic.java interface and exposes its functionality using the LogicManager.java class.

+
+
+
+LogicClassDiagram +
+
Figure 2. Class Diagram of the Logic Component
+
+

How the architecture components interact with each other

+
+

The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command delete 1.

+
+
+
+ArchitectureSequenceDiagram +
+
Figure 3. Component interactions for delete 1 command
+
+
+

The sections below give more details of each component.

+
+
+
+

4.2. UI component

+
+
+UiClassDiagram +
+
Figure 4. Structure of the UI Component
+
+
+

API : Ui.java

+
+
+

The UI consists of a MainWindow which is made up by different components such as StatusBarFooter, FeedbackDisplayBox, + CommandBox as well as variants Panels and Cards. All these components, including the MainWindow, inherit from the abstract UiPart class.

+
+
+

The UI component uses JavaFx UI framework. +The layout of these UI parts are defined in matching .fxml files that are in the src/main/resources/view folder. +For example, the layout of the MainWindow is specified in MainWindow.fxml

+
+
+
+
The UI component
+
+
+
    +
  • +

    Interacts with user in an interactive process with the help of Logic component.

    +
    +
      +
    • +

      CommandBox collects the user keyboard input.

      +
    • +
    • +

      Logic parses user input in each interaction and executes the command subsequently if the interaction ends without any exception.

      +
    • +
    • +

      FeedbackDisplayBox responses system information to user, such as error message and command execution result.

      +
      +
        +
      • +

        When invalid input received, proper message will respond via FeedbackDisplayBox. The interaction of the command will not be terminated, user can continue with the process with valid input.

        +
      • +
      +
      +
    • +
    +
    +
  • +
  • +

    Listens for changes to Model data so that the UI can be updated simultaneously.

    +
    +
      +
    • +

      All Cards components and CalenderPanel, ModuleListPanel, ProductivityPanel and TaskSummaryPanel will listen to +the changes to Model data.

      +
    • +
    +
    +
  • +
+
+
+
+
+
+ + + + + +
+
Note
+
+The command execution will only terminate in two scenarios:
+1. When the command is successfully executed.
+2. When the user enter quit and kbd:[enter] to exit the execution. +
+
+
+
+

4.3. Logic component

+
+
+LogicClassDiagram +
+
Figure 5. Structure of the Logic Component
+
+
+

API : +Logic.java

+
+
+
    +
  1. +

    The InteractiveCommandPrompt in Ui uses the parsers to parse the user command.

    +
  2. +
  3. +

    This results in a Command object which is executed by the LogicManager.

    +
  4. +
  5. +

    The command execution can affect the Model (e.g. adding or editing a task).

    +
  6. +
  7. +

    The result of the command execution is encapsulated as a CommandResult object which is passed back to the Ui.

    +
  8. +
  9. +

    In addition, the CommandResult object can also instruct the Ui to perform certain actions, such as displaying a help message to the user.

    +
  10. +
+
+
+
+

4.4. Model component

+
+
+ModelClassDiagram +
+
Figure 6. Structure of the Model Component
+
+
+

API : Model.java

+
+
+

The Model,

+
+
+
    +
  • +

    stores a UserPref object that represents the user’s preferences.

    +
  • +
  • +

    stores the Study Buddy data.

    +
  • +
  • +

    exposes an unmodifiable ObservableList<Task> 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.

    +
  • +
  • +

    does not depend on any of the other three components.

    +
  • +
+
+
+
+

4.5. Storage component

+
+
+StorageClassDiagram +
+
Figure 7. Structure of the Storage Component
+
+
+

API : Storage.java

+
+
+

The Storage component,

+
+
+
    +
  • +

    can save UserPref objects in json format and read it back.

    +
  • +
  • +

    can save the Study Buddy data in json format and read it back.

    +
  • +
  • +

    saves all tasks, due soon tasks, archived task, modules and stats.

    +
  • +
+
+
+
+

4.6. Common classes

+
+

Classes used by multiple components are in the draganddrop.studybuddy.commons package.

+
+
+
+
+
+

5. Implementation

+
+
+

This section describes some noteworthy details on how certain features are implemented.

+
+
+

5.1. Interactive Command Process Feature

+
+

5.1.1. Implementation

+
+
    +
  1. +

    Feature introduction

    +
    +

    The Interactive Command Process Feature allows user to execute his/her command in an +interactive way.

    +
    +
  2. +
  3. +

    Implementation detail

    +
    +

    This feature applies on all commands provided by Study Buddy and is implemented using:

    +
    +
    +
      +
    1. +

      The CommandBox from UI component to collect user input and init an associate interactivePrompt

      +
    2. +
    3. +

      The InteractivePrompt from Logic component to parse user input step by step and generate meaningful response +message accordingly. +It also produces an executable Command from each successful interaction to perform the user’s desired action.

      +
      +
        +
      1. +

        Different types of InteractivePrompt such as AddTaskInteractivePrompt are provided to handel interactions with different purpose.

        +
        +
        +AddTaskObjectDiagram +
        +
        Figure 8. Object diagram when user add task using interactive command process
        +
        +
      2. +
      3. +

        Allow user to quit from each step of an interaction using quit (case insensitive) key word. Here is an example of user quiting from add task interactive command process.

        +
        +
        +QuitFromInteractionActivityDiagram +
        +
        Figure 9. Activity diagram when user quite from add task interactive command process
        +
        +
      4. +
      +
      +
    4. +
    +
    +
  4. +
+
+
+
+

5.1.2. Example Usage Scenario

+
+

Given below is an example usage scenario and how the interactive command process mechanism behaves at each step.

+
+
+

Step 1. The user launches the application for the first time and skips the user guid. +By following the hint from UI (i.e. when CommandBox is idle, it should display "Please enter your command here…​"), +he can try some random input and hit enter to get the list of available commands.

+
+
+

Step 2. The user picks a command from the list and type it in the CommandBox. The guide information of the next step will +display in FeedbackDisplayBox after user press enter.

+
+
+ + + + + +
+
Note
+
+For some commands there is only one interaction involved, such as help and list. In such a case +the application will execute the command right after user press enter. +
+
+
+

Step 3. The user made a typo mistake in the data and time filed when adding a task record. +Proper massage with the error type and the correct format of the data and time will be displayed in the +FeedbackDisplayBox. User can follow the instruction to continue the interaction.

+
+
+

Step 4. The user is performing an interaction to edit a task, but realized he/she +chose a wrong task from the list, he/she can use quit to exit +the process without making any changes to the task.

+
+
+
+

5.1.3. Design Considerations

+
+
Aspect: How to react to an invalid input
+
+
    +
  • +

    Alternative 1 (current choice): provides relevant error message and stays at current interaction step.

    +
    +
      +
    • +

      If the next input is

      +
      +
        +
      • +

        Invalid: provides the relevant error message and continue waiting for another input.

        +
      • +
      • +

        Valid: start next interaction step.

        +
      • +
      • +

        quit: quite from the command process.

        +
      • +
      +
      +
    • +
    • +

      Pros: Save the data from previous stages, especially in add task interaction, thus user no need to repeatedly +enter the same information. Also the clear instruction provided by error message makes the +interaction more straightforward.

      +
    • +
    • +

      Cons: The interaction can only be stopped when user successfully complete the process or use +quit to exit half-way.

      +
    • +
    +
    +
  • +
  • +

    Alternative 2: Quite from current step with proper error message.

    +
    +
      +
    • +

      Pros: Quit the interaction immediately, which allows user to start with a new +interaction. It will be useful when user want to quit from a particular process but forgets the exit command +(i.e. quit).

      +
    • +
    • +

      Cons: User has to restart the entire interaction process when the he/she enter +invalid command.

      +
    • +
    +
    +
  • +
+
+
+
+
+
+

5.2. Due Soon Tasks Feature

+
+

5.2.1. Implementation

+
+

The Due Soon Tasks feature allows users to view the tasks that have deadlines within the next week.

+
+
+

This feature is implemented using a panel on the main window with a list of tasks Due Soon that is updated with every command that may affect Due Soon task list (such as add, delete or archive).

+
+
+

Some situations that trigger due soon feature are:

+
+
+
    +
  1. +

    When user enters a task:

    +
    +
      +
    1. +

      What it does:

      +
      +
        +
      1. +

        When a task that is added to the main list, is due within the next week, it is automatically added to the list of due soon tasks.

        +
      2. +
      3. +

        The list is automatically sorted to be in increasing order of deadlines.

        +
      4. +
      5. +

        The time left for the deadline is also added.

        +
        +
        +AddDueSoonActivityDiagram +
        +
        Figure 10. Activity Diagram for Add to Due Soon list
        +
        +
        +


        +
        +
      6. +
      +
      +
    2. +
    3. +

      Details:

      +
      +
        +
      1. +

        The add command when entered by the user, triggers the creation of an object of the InteractivePrompt class (in this case AddTaskInteractivePrompt).

        +
      2. +
      3. +

        In the AddTaskInteractivePrompt class, the data entered by user is parsed.

        +
      4. +
      5. +

        If there are no errors, the AddTaskCommand object is created which triggers the addTask() function in Model.

        +
      6. +
      7. +

        This function in turns calls addTask() function in Study Buddy.

        +
      8. +
      9. +

        This function calls the isDueSoon() function in Task to confirm if the task belong to the due soon list.

        +
      10. +
      11. +

        If it does, it is added to due soon list and main list, and the due soon list is sorted. Else, it is simply added to the main list.

        +
        +
        +AddDueSoonSequence +
        +
        Figure 11. Sequence Diagram for Add to Due Soon list
        +
        +
        +


        +
        +
        + + + + + +
        +
        Caution
        +
        +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
        +
        +
        +
      12. +
      +
      +
    4. +
    +
    +
  2. +
  3. +

    When user deletes a task:

    +
    +
      +
    1. +

      What it does:

      +
      +
        +
      1. +

        When a task that is deleted from the main list occurs in the due soon list as well, it is automatically deleted.

        +
        +
        +DeleteDueSoonActivityDiagram +
        +
        Figure 12. Activity Diagram for Delete from Due Soon list
        +
        +
        +


        +
        +
      2. +
      +
      +
    2. +
    3. +

      Details:

      +
      +
        +
      1. +

        The delete command when entered by the user, triggers the creation of an object of the InteractivePrompt class (in this case DeleteTaskInteractivePrompt).

        +
      2. +
      3. +

        In the DeleteTaskInteractivePrompt class, the data entered by user is parsed.

        +
      4. +
      5. +

        If there are no errors, the DeleteTaskCommand object is created which triggers the deleteTask() function in Model.

        +
      6. +
      7. +

        This function in turns calls removeTask() function in Study Buddy.

        +
      8. +
      9. +

        removeTask() calls the updateDeleteDueSoon() function in StudyBuddy which checks if the task exists in the due soon list.

        +
      10. +
      11. +

        If it does, it is deleted from the due soon list and main list. Else, it is simply deleted from the main list.

        +
        +
        +DeleteDueSoonSequence +
        +
        Figure 13. Sequence Diagram for Delete from Due Soon list
        +
        +
        +


        +
        +
        + + + + + +
        +
        Caution
        +
        +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
        +
        +
      12. +
      +
      +
    4. +
    +
    +
  4. +
  5. +

    When user refreshes due soon list:

    +
    +
      +
    1. +

      What it does:

      +
      +
        +
      1. +

        Refreshes the list of due soon tasks and status tags. This command is useful for a situation where due soon list is not up to date due to a drastic change in time.

        +
        +
        +DueSoonActivityDiagram +
        +
        Figure 14. Activity diagram for refresh
        +
        +
        +


        +
        +
      2. +
      +
      +
    2. +
    3. +

      Details:

      +
      +
        +
      1. +

        The refresh command when entered by the user, triggers the creation of an object of the InteractivePrompt class (in this case RefreshTaskInteractivePrompt).

        +
      2. +
      3. +

        In the RefreshTaskInteractivePrompt class, the data entered by user is parsed.

        +
      4. +
      5. +

        If there are no errors, the RefreshCommand object is created which clears the due soon list and then, iterates through the main list and calls addDueSoonTask() in Model, for any tasks that are due soon.

        +
        +
        +DueSoonSequenceDiagram +
        +
        Figure 15. Sequence diagram for refresh
        +
        +
        +


        +
        +
        + + + + + +
        +
        Caution
        +
        +The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
        +
        +
      6. +
      +
      +
    4. +
    +
    +
  6. +
  7. +

    When the application launches:

    +
    +
      +
    1. +

      What it does:

      +
      +
        +
      1. +

        It loads the due soon tasks into a panel by filtering tasks that are due soon from the main list.

        +
      2. +
      3. +

        This is necessary, because old list of due soon tasks may not be up-to-date.

        +
      4. +
      +
      +
    2. +
    3. +

      Details:

      +
      +
        +
      1. +

        The addTask() function in StudyBuddy class already checks if task is due soon and adds to due soon list (as mentioned above).

        +
      2. +
      3. +

        While all tasks are being added to their respective lists in JsonSerializableStudyBuddy class, the due soon list gets automatically updated.

        +
      4. +
      +
      +
    4. +
    +
    +
  8. +
+
+
+ + + + + +
+
Note
+
+Other commands like edit, archive etc also trigger due soon feature in a similar manner. +
+
+
+ + + + + +
+
Note
+
+Calculation of time left for deadline and check for if task is due soon can be found in the Task class. +
+
+
+
+

5.2.2. Example Usage Scenario

+
+

Given below is an example usage scenario and how the Due Soon list mechanism behaves at each step.

+
+
+

Step 1. The user launches the application for the first time.

+
+
+

The list of tasks Due Soon will be initialized and displayed with the initial study buddy state. Initialization is done by filtering tasks that are Due Soon from the general list of tasks.

+
+
+

Step 2. The user executes add command to add a task. +The add command execution checks if this task belongs in the Due Soon tasks list (i.e it is due in 7 days). If it does, the task is added to both lists, else it is only added to the main list.

+
+
+

Step 3. The user executes delete command to delete a task. +The delete command execution also checks if this task exists in the Due Soon task list. If it does, task is deleted from both lists, else it is only deleted from the main list.

+
+
+

Step 4. The user executes refresh command to refresh the due soon task list. +The refresh command execution will traverse the main list and check if there are any inconsistencies. For example, if there has been a change in time and a task is missing from the due soon task list, it will be added. +It will also update the time left.

+
+
+ + + + + +
+
Note
+
+If there are no such inconsistencies, the refresh command will not make any changes to the Due Soon task list. +
+
+
+
+

5.2.3. Design Considerations

+
+
Aspect: How refresh command works
+
+
    +
  • +

    Alternative 1 (current choice): Clear and reload the due soon task list.

    +
    +
      +
    • +

      Pros: Less prone to errors since the entire list is "refreshed".

      +
    • +
    • +

      Cons: More operation intensive.

      +
    • +
    +
    +
  • +
  • +

    Alternative 2: Does not clear and reload the due soon task list.

    +
    +
      +
    • +

      Pros: Fewer operations need to be performed.

      +
    • +
    • +

      Cons: May have be more prone to errors because list is not completely "refreshed". Some parts of it are the same.

      +
    • +
    +
    +
  • +
+
+
+
+
+
+

5.3. Task Summary Feature

+
+

5.3.1. Implementation

+
+
    +
  1. +

    Feature introduction

    +
    +

    The task summary feature automatically summarizes the collected data into different charts. +It also allows the user to click on a chart to find the relevant tasks. +The UI of the feature is in the Statistics Page.

    +
    +
  2. +
  3. +

    Implementation detail

    +
    +

    This feature is implemented using JavaFx charts such as PieChart, AreaChart and StackedBarChart, as well as a +Task List Panel.

    +
    +
    +

    The Task List Panel is used to show the relevant task records when the user clicks on charts.

    +
    +
  4. +
  5. +

    Table of Charts & DataBind & OnClick Action

    +
    + + + + + +
    +
    Tip
    +
    +To improve the readability, only the tasks due or start within the next 60 days will be counted into Area Chart. +
    +
    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
    Chart TypeData UsedOnClick Action

    PieChart
    +
    +Compare the number of tasks in different statuses.


    +TaskStatus, TaskCount

    Display all tasks with the selected status.

    AreaChar
    +
    +Summarize the task deadlines or start dates for different modules.


    +ModuleCode, Deadline/Start date,
    + TaskCount

    Click on area:
    +Display tasks under the selected module.
    +
    +Click on data point:
    +Display tasks under the selected module and will due or start the chosen date.

    StackedBar Chart
    +
    +Compare the weight of different types of tasks in each module.


    +ModuleCode, TaskType, WeightSum

    Display tasks under the selected module and type.

    +
    +
    +TaskSummaryOnClickActivityDiagram +
    +
    Figure 16. Sequence diagram for task summary UI update when data change
    +
    +
  6. +
  7. +

    OnChangeListener

    +
    +

    The feature listens to the change of Model’s UnArchived Task Records, Archived Task Records and Module Records.

    +
    +
    +

    Once a change is captured, the charts will automatically re-render to show the latest statistics.

    +
    +
    +

    Currently, commands as add edit delete sort find archive done list clear etc. can +trigger the refresh of the charts.

    +
    +
    +
    +TaskSummaryOnDataChangeSequenceDiagram +
    +
    Figure 17. Sequence diagram for task summary UI update when data change
    +
    +
    + + + + + +
    +
    Note
    +
    +It is possible that the labels of charts can overlap together. +This is an unfixed bug regarding the JDK which is caused by JavaFX chart off-sync. To get more information, you may refer to here. +When this issue happens, you can use any command that can trigger chart updating to refresh. +
    +
    +
  8. +
+
+
+
+

5.3.2. Example Usage Scenario

+
+

Given below is an example usage scenario and how the task summary mechanism behaves at each step.

+
+
+

Step 1. The user launches the application for the first time, the statistics will perform on top of the sample records, +and the result will be visualized into different charts organized in the Tab Panel. After the user clicks Statistics +from the top menu bar, the Tab Panel and the Task List Panel will display.

+
+
+

Step 2. The user navigates to the Statistics Page for the first time. The Tab Panel should +display the Pie Chart and the Task List Panel is empty with a title: "Click on Chart to View Related Tasks". +Indeed, this is how the Statistics Page looks like every time the user navigates back from another Page.

+
+
+

Step 3. The user clicks on Pie Chart 's Pending portion. All tasks in Pending status should display in Task List Panel. +Meanwhile, the title of the Panel will change to "PENDING: # Tasks" (# stands for the number of Pending tasks).

+
+
+

Step 4. The user clicks on Area Chart 's CS2101 area. All tasks under CS2101 should display in Task List Panel. +Meanwhile, the title of the Panel will change to "Tasks under CS2101".

+
+
+

Step 5. The user executes add command at Statistics Page, +the charts should update automatically.

+
+
+

Step 6. The user executes done command at another page, and navigate back to Statistics Page +the charts should show the latest statistics.

+
+
+
+

5.3.3. Design Considerations

+
+
Aspect: Will this feature contribute value to CLI user
+
+
+
Consideration
+
+

Task Summary feature involves mouse clicking event when user retrieving relevant tasks.

+
+
Explanation
+
+

The Task Summary Feature provides tow main services:

+
+
    +
  1. +

    The automatic statistics of the user input (i.e. the tasks and modules information).

    +
  2. +
  3. +

    The relevant records retrieving.

    +
  4. +
+
+
+

The retrieving service is built on top of the statistics result. +Meanwhile, the statistics is auto-generated along the way the user managing their records using keyboard input.
+Therefore, this feature can make a fast typist be more productive, especially when Study Buddy +supports the CLI.

+
+
+
+
+
+
+
Aspect: How to update charts
+
+
    +
  • +

    Alternative 1 (current choice): Use onChangeListener to monitor the data update and re-render the UI simultaneously.

    +
    +
      +
    • +

      Pros: More user-friendly, no need to ask user to manually update.

      +
    • +
    • +

      Cons: Might encounter JavaFX chart off-sync bug, and results in label overlapping. But user can always use another +command which can trigger data updating to walk around this problem.

      +
    • +
    +
    +
  • +
  • +

    Alternative 2: Trigger the UI rendering by asking the user to re-launch the application or navigate away and back to the page.

    +
    +
      +
    • +

      Pros: Safe from the JavaFX chart off-sync bug.

      +
    • +
    • +

      Cons: Force user to close or navigate around the application every time he/she wants to +check the updated charts.

      +
    • +
    +
    +
  • +
+
+
+
+
+
+

5.4. Calendar feature

+
+

5.4.1. Implementation

+
+

The calendar feature displays a calendar for users.

+
+
+

The feature is implemented by overriding the task list display panel on the main window with calendar box. The calendar currently supports following features:

+
+
+
    +
  1. +

    Displays the name of all tasks on that day in the calendar grid.

    +
  2. +
  3. +

    Access calendars in previous or next month using the buttons on top.

    +
  4. +
  5. +

    Displays more information about tasks for the day on the Due Soon panel after clicking on a grid.

    +
  6. +
  7. +

    Fast forward to a specific year/month using CLI.

    +
  8. +
+
+
+

When a calender is requested, a CalendarPanel object is constructed, the object diagram below shows the structure of a CalendarPanel. We will be using the date 01/04/2020 as an example.

+
+
+
+CalendarBoxObjectDiagram +
+
Figure 18. CalendarPanel object diagram
+
+
+
+

5.4.2. Example usage scenarios

+
+
Using mouse click
+
+

Clicking on the show calendar menu item under the calendar menu will enable this feature. Upon requesting for the calendar to be shown:

+
+
+
    +
  1. +

    The calendar box object will be constructed

    +
  2. +
  3. +

    The calendar loops through every day of the month while searching for tasks due on that day

    +
  4. +
  5. +

    The task name is added to the calendar grid

    +
  6. +
+
+
+
+
Using CLI
+
+

As of Study Buddy v1.4, a new feature has been added that allows users to navigate the calendar using CLI.

+
+
+
    +
  1. +

    The user enters 'calendar' into the command box.

    +
  2. +
  3. +

    The user enters the selected date into the command box.

    +
  4. +
  5. +

    Calendar will be generated the same way as a mouse click, however, it will use the selected date as parameters.

    +
  6. +
+
+
+

Below is an activity diagram describing the events that will happen:

+
+
+
+CalendarActivityDiagram +
+
Figure 19. Calendar Activity Diagram
+
+
+
+
+

5.4.3. Design considerations

+
+
    +
  • +

    It is more efficient to cache the calendar rather than to generate a new one, however, we do not expect the user to have too many tasks and therefore it should not slow down the application.

    +
  • +
+
+
+
+
+

5.5. Archive feature

+
+

Archive stores selected task away into a separate task list, this command is used when the user has completed a task but still wants to keep track of it.

+
+
+

5.5.1. Implementation

+
+

Archive uses both the old delete and a new archive command. Upon executing the archive command, it will call the model to delete the task and archive it elsewhere.

+
+
+

The archived task list is stored within Model as a seperate list.

+
+
+ + + + + +
+
Note
+
+The index for archived tasks are not used for any commands other than unarchive. +
+
+
+

Sequence diagram:

+
+
+
+ArchiveSequenceDiagram +
+
Figure 20. Archive Sequence Diagram
+
+
+ + + + + +
+
Caution
+
+The lifeline for every member should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
+
+
+
+
+

5.6. Productivity feature

+
+

5.6.1. Implementation

+
+

The productivity feature displays insights related to the user’s productivity over the +past day, week and more on the Productivity panel. +The Productivity page is integrated with the main page as a side panel.

+
+
+

The Productivity page is further composed of 3 tabs:

+
+
+
    +
  1. +

    Daily Productivity Tab

    +
  2. +
  3. +

    Weekly Productivity Tab

    +
  4. +
  5. +

    Productivity Points Tab

    +
  6. +
+
+
+

The Productivity page can be viewed by clicking on the Productivity menu item, +which directs the user to the Daily Productivity Tab. +The Productivity page can also be viewed by clicking on the Productivity Points shown on +the top right of the application window. +This directs the user to the Productivity Points Tab.

+
+
+

The productivity feature is facilitated by the Statistics class, which allows +StudyBuddy to keep track of relevant usage statistics of the user. +Statistics is further composed of classes that keep track of specific statistics:

+
+
+
    +
  1. +

    CompletionStats keeps track of the number of tasks completed by the user each day and each week

    +
  2. +
  3. +

    OverdueStats keeps track of the number of tasks that went overdue each day and each week.

    +
  4. +
  5. +

    ScoreStats keeps track of the user’s Productivity Points and rank each day

    +
  6. +
  7. +

    GeneralStats keeps track of the user’s goal, streak, and other statistics not covered by the other statistics classes

    +
  8. +
+
+
+

The user can gain or lose Productivity Points in StudyBuddy when certain actions or events are completed. These include:

+
+
+
    +
  1. +

    Adding a task: +1

    +
  2. +
  3. +

    Completing a task: +10

    +
  4. +
  5. +

    Completing your daily goal: +(points equivalent to daily goal)

    +
  6. +
  7. +

    Using advanced features; +1

    +
  8. +
  9. +

    Letting a task go Overdue: -1

    +
  10. +
+
+
+

Each usage statistic is updated accordingly when the respective user action or event +has concluded. These statistics are then rendered on the ProductivityPanel. +The chart visualizations are implemented using ProgressIndicator, BarChart and AreaChart.

+
+
+

When the statistics are updated, the task list’s event listener and classes implementing +GoalObserver will be informed of the changes. ProductivityPanel re-renders the +displayed information when either of these are updated.

+
+
+

The data displayed will be automatically updated upon calling any of the following commands:

+
+
+
    +
  • +

    add

    +
  • +
  • +

    done

    +
  • +
  • +

    delete

    +
  • +
  • +

    refresh

    +
  • +
  • +

    goal

    +
  • +
+
+
+
+

5.6.2. Example Use Scenario

+
+

Given below is an example usage scenario and how the +Productivity feature behaves at each step.

+
+
+

Step 1: The user launches the application. +Step 2: The Productivity feature displays the user’s Productivity Points on the top right of the screen. +Step 3: The user clicks the Productivity Menu button +Step 4: The Daily Productivity Tab is displayed to the user +Step 5: The user completes a task using done +Step 6: The daily number of tasks is added and Productivity Points is increased. +If the daily goal has been reached, the user’s streak is incremented.

+
+
+

Here is an activity diagram of the aforementioned steps:

+
+
+
+ProductivityActivityDiagram +
+
Figure 21. Productivity Feature Example Activity Diagram
+
+
+

Extension: Suppose the user sees the Productivity Points and clicks it +Step 3: The user clicks the Productivity Points on the top right of the screen +Step 4: The Productivity Points Tab is displayed to the user

+
+
+

From here, the user can continue to manage tasks as per Step 5 and 6 above, +or navigate to other Productivity tabs.

+
+
+
Clicking the Productivity menu item
+
+

image

+
+
+
+
+

5.6.3. Design Considerations

+
+
Aspect: How to re-render Productivity Panel when statistics are updated
+
+

Alternative 1: re-render only the values that have been updated

+
+
+
    +
  • +

    Pros: maximizes loading speed and minimizes lag for the user

    +
  • +
  • +

    Cons: increases complexity for codebase, higher chance of bugs occuring

    +
  • +
+
+
+

Alternative 2: always re-render the whole Productivity Panel

+
+
+
    +
  • +

    Pros: easy to implement

    +
  • +
  • +

    Cons: may result in slower loading speed and more lag for the user

    +
  • +
+
+
+

Alternative 3 (current choice): re-render only the values that have been updated +if it does not result in increased code complexity

+
+
+
    +
  • +

    Pros: improves loading speed and decreases lag for the user, +while keeping the codebase readable and easy to reason with.

    +
  • +
  • +

    Cons: may result in slower loading speed. However, based on testing, +this trade-off does not result in any measurable delay.

    +
  • +
+
+
+
+
+
+

5.7. Modules

+
+

The modules feature enables users to be able to group and view their tasks according to various modules or subjects. +Each module is assigned with a unique module code & a name. +By default, all task created with the add command will be be assigned to module code OO0000O.

+
+
+

5.7.1. Implementation

+
+

Modules are created with create mods Command and the program will request for a module name and module code. There are no restrictions on module name as long as it is not an empty entry.

+
+
+

Module codes however, require at least an alphabetical prefix, a number, and a postfix(optional).

+
+
+
+
Correct moduleCodes:
+A0A
+CS11X
+AA1234
+
+Incorrect moduleCodes:
+123456
+CAT
+555T
+
+
+
+
+

5.7.2. Sequence diagram for creating modules

+
+

This is a sequence of how a module is created using the create mods feature. Take note that all interactions go through the CommandBox first in the UI, but it will be omitted from this diagram for simplicity.

+
+
+
+UMLmodule +
+
Figure 22. Sequence diagram for modules
+
+
+
+
+

5.8. Logging

+
+

We are using java.util.logging package for logging. +The LogsCenter class is used to manage the logging levels and logging destinations.

+
+
+
    +
  • +

    The logging level can be controlled using the logLevel setting in the configuration file (See Section 5.9, “Configuration”)

    +
  • +
  • +

    The Logger for a class can be obtained using LogsCenter.getLogger(Class) which will log messages according to the specified logging level

    +
  • +
  • +

    Currently log messages are output through: Console and to a .log file.

    +
  • +
+
+
+

Logging Levels

+
+
+
    +
  • +

    SEVERE : Critical problem detected which may possibly cause the termination of the application

    +
  • +
  • +

    WARNING : Can continue, but with caution

    +
  • +
  • +

    INFO : Information showing the noteworthy actions by the App

    +
  • +
  • +

    FINE : Details that is not usually noteworthy but may be useful in debugging e.g. print the actual list instead of just its size

    +
  • +
+
+
+
+

5.9. Configuration

+
+

Certain properties of the application can be controlled (e.g user prefs file location, logging level) through the configuration file (default: config.json).

+
+
+
+

5.10. [Proposed] Data encryption

+
+

Since Study Buddy is an offline application, there is no threat of being attacked via a network channel. However, in case the computer has a shared owner, a password feature can be implemented in the future for privacy purposes.

+
+
+

5.10.1. Implementation

+
+

The goal is to encrypt taskList3.json, while still allowing the owner to access his/her tasks using his password.

+
+
+

We will be using AES (Advanced Encryption Scheme) for encryption, and a slow hashing algorithm to derive a key from the user’s password. The slow hashing algorithm is to prevent brute force attacks.

+
+
+
+
+

Encryption

+
+
+
    +
  1. +

    User sets a password. (Optional)

    +
  2. +
  3. +

    Study Buddy uses a slow hashing algorithm (bCrypt) to generate a key.

    +
  4. +
  5. +

    When user exits the app, Study Buddy will encrypt taskList.json using the conceal library and the generated key.

    +
  6. +
  7. +

    TaskList.json should now be encrypted

    +
  8. +
+
+
+
+
+
+
+

Decryption

+
+
+
    +
  1. +

    User enters a password.

    +
  2. +
  3. +

    If the password is correct, the same key should be hashed and taskList.json can be decrypted.

    +
  4. +
  5. +

    If the password is incorrect, user will be allowed to try again.

    +
  6. +
+
+
+
+
+

We leave it to the user’s own jurisdiction to create a strong password.

+
+
+
+
+
+
+

6. Documentation

+
+
+

Refer to the guide here.

+
+
+
+
+

7. Testing

+
+
+

Refer to the guide here.

+
+
+
+
+

8. Dev Ops

+
+
+

Refer to the guide here.

+
+
+
+
+

Appendix A: Product Scope

+
+
+

Target user profile:

+
+
+
    +
  • +

    has a need to manage a significant number of tasks for various modules

    +
  • +
  • +

    appreciates visualization tools to aid in task management

    +
  • +
  • +

    prefers desktop apps over mobile apps

    +
  • +
  • +

    can type fast

    +
  • +
  • +

    prefers typing over mouse input

    +
  • +
+
+
+

Value proposition: manages tasks faster than a typical mouse/GUI driven app

+
+
+
+
+

Appendix B: User Stories

+
+
+

Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *

+
+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PriorityAs a …​I want to …​So that I can…​

* * *

new user

see usage instructions

refer to instructions when I forget how to use the App

* * *

user

view a list of my tasks

know what I have Pending

* * *

user

add a new task

view all my tasks in one place

* * *

user

delete a task

remove entries that I no longer need

* * *

user

mark a task as completed

update my list of Pending tasks

* * *

user

find a task by keyword

locate details of a task without having to go through the entire list

* *

user with task deadline extended

edit the particular task

update my task accordingly

* *

user with many deadlines

sort tasks in order of deadlines

organise my list by priority

* *

user

archive tasks

separate the tasks that are not applicable right now

* *

user

view renamed tasks

easily filter out any renamed data in my list

* *

user

filter all pending tasks

view all my Pending tasks in one place

* *

user who likes organization

view all my tasks that are Due Soon

know what to focus on in the next week

* *

user who makes typos

be able to edit a task I have added

correct any typos I have made

* *

user who is forgetful

have an interactive command prompt

not have to remember long commands

* *

user who is starting a new semester

clear all my tasks

start adding on to an empty list

* *

user who takes many modules

add my modules

view my modules

* *

user who has many tasks

check the summary of their current status

better plan my time

* *

user who has many tasks

check the summary of their current status

better plan my time

* *

user who finds it hard to keep track of all my deadlines

have a calendar

easily find tasks due on a day

+
+
+
+

Appendix C: Use Cases

+
+
+

(For all use cases below, the System is Study Buddy and the Actor is the statistics, unless specified otherwise)

+
+

Use case: List task

+
+

MSS

+
+
+
    +
  1. +

    User is on the All tasks or productivity tab.

    +
  2. +
  3. +

    User requests to list tasks

    +
  4. +
  5. +

    Study Buddy shows a list of unarchived tasks

    +
    +

    Use case ends.

    +
    +
  6. +
+
+

Use case: Delete task

+
+

MSS

+
+
+
    +
  1. +

    Refer to List task use case

    +
  2. +
  3. +

    User requests to delete a specific task in the list

    +
  4. +
  5. +

    Study Buddy asks for the index

    +
  6. +
  7. +

    User provides index

    +
  8. +
  9. +

    Study Buddy deletes the task

    +
    +

    Use case ends.

    +
    +
  10. +
+
+
+

Extensions

+
+
+
    +
  • +

    2a. +The list is empty.

    +
    +

    Use case ends.

    +
    +
  • +
  • +

    3a. +The given index is invalid.

    +
    +
      +
    • +

      3a1. Study Buddy shows an error message.

      +
      +

      Use case resumes at step 2.

      +
      +
    • +
    +
    +
  • +
+
+

Use case: Filter tasks

+
+

MSS

+
+
+
    +
  1. +

    User requests to filter tasks

    +
  2. +
  3. +

    Study Buddy shows two options for filter

    +
  4. +
  5. +

    User requests to filter by status

    +
  6. +
  7. +

    Study Buddy provides options to filter by status

    +
  8. +
  9. +

    User provides input

    +
  10. +
  11. +

    Study Buddy shows filtered task list

    +
    +

    Use case ends.

    +
    +
  12. +
+
+
+

Extensions

+
+
+
    +
  • +

    3a. +The given index is invalid.

    +
    +
      +
    • +

      3a1. Study Buddy shows an error message.

      +
      +

      Use case resumes at step 2.

      +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • +

    3a. +User chooses to filter by type instead.

    +
    +
      +
    • +

      4a. Study Buddy provides options to filter by type

      +
      +

      Use case resumes at step 5.

      +
      +
    • +
    +
    +
  • +
+
+

Use case: View renamed

+
+

MSS

+
+
+
    +
  1. +

    User requests to view renamed tasks

    +
  2. +
  3. +

    Study Buddy shows a list of renamed tasks

    +
    +

    Use case ends.

    +
    +
  4. +
+
+
+

Extensions

+
+
+
    +
  • +

    2a. +The list is empty.

    +
    +

    Use case ends.

    +
    +
  • +
  • +

    3a. +There are no duplicate tasks

    +
    +

    Use case ends.

    +
    +
  • +
+
+

Use case: Refresh

+
+

MSS

+
+
+
    +
  1. +

    User notices Due Soon list needs to be updates

    +
  2. +
  3. +

    User requests to refresh

    +
  4. +
  5. +

    Study Buddy refreshes the Due Soon list and status tags

    +
    +

    Use case ends.

    +
    +
  6. +
+
+
+

Extensions

+
+
+
    +
  • +

    2a. +The list is empty.

    +
    +

    Use case ends.

    +
    +
  • +
  • +

    3a. +There is nothing to refresh

    +
    +

    Use case ends.

    +
    +
  • +
+
+
+
+
+

Appendix D: Non Functional Requirements

+
+
+
    +
  1. +

    Should work on any mainstream OS as long as it has Java 11 or above installed.

    +
  2. +
  3. +

    Should be able to hold a good number of tasks without a noticeable sluggishness in performance for typical usage.

    +
  4. +
  5. +

    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.

    +
  6. +
+
+
+
+
+

Appendix E: Glossary

+
+
+
+
Mainstream OS
+
+

Windows, Linux, Unix, OS-X

+
+
+
+
+
+
GUI
+
+

Graphical User Interface i.e a user interface that allows users to interact using graphical icons rather than text-based user interfaces

+
+
+
+
+
+
Index
+
+

The index of a task refers to the sequence number of a task in the dashboard

+
+
+
+
+
+
+

Appendix F: Instructions for Manual Testing

+
+
+

Given below are instructions to test the app manually.

+
+
+ + + + + +
+
Note
+
+These instructions only provide a starting point for testers to work on; testers are expected to do more exploratory testing. +
+
+
+

F.1. Launch and Shutdown

+
+
    +
  1. +

    Initial launch

    +
    +
      +
    1. +

      Download the jar file and copy into an empty folder

      +
    2. +
    3. +

      Double-click the jar file
      + Expected: Shows the GUI with a set of sample tasks. +The window size may not be optimum.

      +
    4. +
    +
    +
  2. +
  3. +

    Saving window preferences

    +
    +
      +
    1. +

      Resize the window to an optimum size. +Move the window to a different location. +Close the window.

      +
    2. +
    3. +

      Re-launch the app by double-clicking the jar file.
      +Expected: The most recent window size and location is retained.

      +
    4. +
    +
    +
  4. +
+
+
+
+

F.2. Deleting a task

+
+
    +
  1. +

    Deleting a task while all tasks are listed

    +
    +
      +
    1. +

      Prerequisites: List all tasks using the list command. +Multiple tasks in the list.

      +
    2. +
    3. +

      Test case: delete [Enter] + 1
      + Expected: First task is deleted from the list. +Successful deletion indication in the status message.

      +
    4. +
    5. +

      Test case: delete [Enter] + 0
      + Expected: No task is deleted. +Error details shown in the status message.

      +
    6. +
    7. +

      Other incorrect delete commands to try: delete x(where x is anything)

      +
    8. +
    +
    +
  2. +
+
+
+
+

F.3. Saving data

+
+
    +
  1. +

    Dealing with missing/corrupted data files

    +
    +
      +
    1. +

      Prerequisites: Delete the "tasklist.json" file from data folder.

      +
    2. +
    3. +

      Test case: Launch the application
      + Expected: The application indicates that the data file needed is missing and creates one. +c

      +
    4. +
    5. +

      Prerequisites: Modify the "tasklist.json" file to show some incorrect data.

      +
    6. +
    7. +

      Test case: Launch the application
      + Expected: The application indicates that the data file is corrupted. +Application launches successfully but has no data.

      +
    8. +
    +
    +
  2. +
+
+
+
+
+
+

Appendix G: Effort

+
+
+
+
+

Interactive prompt

+
+
+
    +
  • +

    AB3 requires users to input a whole line of text at once, which is unintuitive and prone to typos by the user. Furthermore, AB3 uses tags like +“\p” to break the user’s input up for parsing. This means that users will not be able to use these strings for any of their inputs.

    +
  • +
  • +

    Study buddy fixes that issue by introducing an interactive prompt for every command. This required a lot effort as there had to be an interactive prompt +for every command.

    +
  • +
+
+
+
+
+
+
+

Refactoring

+
+
+
    +
  • +

    AB3 uses the Person class which had 5 fields. Study buddy has 12 fields, every one of them is used in a major feature.

    +
  • +
+
+
+
+
+
+
+ + + diff --git a/docs/Documentation.adoc b/docs/Documentation.adoc index ad90ac87bda..d60f0b0432f 100644 --- a/docs/Documentation.adoc +++ b/docs/Documentation.adoc @@ -1,4 +1,4 @@ -= AddressBook Level 3 - Documentation += Study Buddy - Documentation :site-section: DeveloperGuide :toc: :toc-title: @@ -12,7 +12,7 @@ ifdef::env-github[] :note-caption: :information_source: :warning-caption: :warning: endif::[] -:repoURL: https://github.com/se-edu/addressbook-level3/tree/master +:repoURL: https://github.com/AY1920S2-CS2103T-W16-3/main == Introduction @@ -40,10 +40,11 @@ We use https://www.google.com/chrome/browser/desktop/[Google Chrome] for convert Here are the steps to convert the project documentation files to PDF format. -. Follow the instructions in <> to convert the AsciiDoc files in the `docs/` directory to HTML format. -. Go to your generated HTML files in the `build/docs` folder, right click on them and select `Open with` -> `Google Chrome`. -. Within Chrome, click on the `Print` option in Chrome's menu. -. Set the destination to `Save as PDF`, then click `Save` to save a copy of the file in PDF format. For best results, use the settings indicated in the screenshot below. +. Follow the instructions in <> to convert the AsciiDoc files in the `docs/` directory to HTML format. +. Go to your generated HTML files in the `build/docs` folder, right click on them and select `Open with` -> `Google Chrome`. +. Within Chrome, click on the `Print` option in Chrome's menu. +. Set the destination to `Save as PDF`, then click `Save` to save a copy of the file in PDF format. +For best results, use the settings indicated in the screenshot below. .Saving documentation as PDF files in Chrome image::chrome_save_as_pdf.png[width="300"] @@ -56,7 +57,7 @@ The link:{repoURL}/build.gradle[`build.gradle`] file specifies some project-spec [TIP] Attributes left unset in the `build.gradle` file will use their *default value*, if any. -[cols="1,2a,1", options="header"] +[cols="1,2a,1",options="header"] .List of site-wide attributes |=== |Attribute name |Description |Default value @@ -71,9 +72,9 @@ If set, the name will be displayed near the top of the page. Setting this will add a "View on GitHub" link in the navigation bar. |_not set_ -|`site-seedu` -|Define this attribute if the project is an official SE-EDU project. -This will render the SE-EDU navigation bar at the top of the page, and add some SE-EDU-specific navigation items. +|`site-draganddrop` +|Define this attribute if the project is an official draganddrop project. +This will render the draganddrop navigation bar at the top of the page, and add some draganddrop-specific navigation items. |_not set_ |=== @@ -88,7 +89,7 @@ Asciidoctor's https://asciidoctor.org/docs/user-manual/#builtin-attributes[built [TIP] Attributes left unset in `.adoc` files will use their *default value*, if any. -[cols="1,2a,1", options="header"] +[cols="1,2a,1",options="header"] .List of per-file attributes, excluding Asciidoctor's built-in attributes |=== |Attribute name |Description |Default value @@ -112,8 +113,7 @@ _{asterisk} Official SE-EDU projects only_ The files in link:{repoURL}/docs/stylesheets[`docs/stylesheets`] are the https://developer.mozilla.org/en-US/docs/Web/CSS[CSS stylesheets] of the site. You can modify them to change some properties of the site's design. -The files in link:{repoURL}/docs/templates[`docs/templates`] controls the rendering of `.adoc` files into HTML5. -These template files are written in a mixture of https://www.ruby-lang.org[Ruby] and http://slim-lang.com[Slim]. +The files in link:{repoURL}/docs/templates[`docs/templates`] controls the rendering of `.adoc` files into HTML5. These template files are written in a mixture of https://www.ruby-lang.org[Ruby] and http://slim-lang.com[Slim]. [WARNING] ==== diff --git a/docs/LearningOutcomes.adoc b/docs/LearningOutcomes.adoc deleted file mode 100644 index 436c1777617..00000000000 --- a/docs/LearningOutcomes.adoc +++ /dev/null @@ -1,216 +0,0 @@ -= Learning Outcomes -:site-section: LearningOutcomes -:toc: macro -:toc-title: -:toclevels: 1 -:imagesDir: images -:stylesDir: stylesheets -ifdef::env-github[] -:note-caption: :information_source: -endif::[] - -After studying this code and completing the corresponding exercises, you should be able to, - -toc::[] - -== Utilize User Stories `[LO-UserStories]` - -=== References - -* https://se-edu.github.io/se-book/specifyingRequirements/userStories/[se-edu/se-book: Requirements: Specifying Requirements: User Stories] - -=== Exercise: Add more user stories - -* Assume you are planing to expand the functionality of the AddressBook (but keep it as a CLI application). -What other user stories do you think AddressBook should support? Add those user stories to the `DeveloperGuide.adoc`. - -== Utilize use cases `[LO-UseCases]` - -=== References - -* https://se-edu.github.io/se-book/specifyingRequirements/useCases/[se-edu/se-book: Requirements: Specifying Requirements: Use Cases] - -=== Exercise: Add a 'Rename tag' use case - -* Add a use case to the `DeveloperGuide.adoc` to cover the case of _renaming of an existing tag_. -e.g. rename the tag `friends` to `buddies` (i.e. all persons who had the `friends` tag will now have -a `buddies` tag instead) -Assume that AddressBook confirms the change with the user before carrying out the operation. - -== Use Non Functional Requirements `[LO-NFR]` - -=== References - -* https://se-edu.github.io/se-book/requirements/nonFunctionalRequirements/[se-edu/se-book: Requirements: Non-Functional Requirements] - -=== Exercise: Add more NFRs - -* Add some more NFRs to the `DeveloperGuide.adoc` - -== Use Polymorphism `[LO-Polymorphism]` - -Note how the `Command::execute()` method shows polymorphic behavior. - -=== References - -* https://se-edu.github.io/se-book/oop/polymorphism/[se-edu/se-book: Paradigms: OOP: Polymorphism] -* https://se-edu.github.io/se-book/cppToJava/inheritance/polymorphism/[se-edu/se-book: C++ to Java: OOP: Polymorphism] - -=== Exercise: Add a polymorphic `isMutating` method - -* Add a method `boolean isMutating()` to the `Command` class. This method will return `true` for -command types that mutate the data. e.g. `AddCommand` -* Currently, AddressBook data are saved to the file after every command. -Take advantage of the the new method you added to limit file saving to only for command types that mutate data. -i.e. `add` command should always save the data while `list` command should never save data to the file. - -[NOTE] -==== -There may be better ways to limit file saving to commands that mutate data. The above approach, while not -optimal, will give you chance to implement a polymorphic behavior. -==== - -== Use abstract classes/methods `[LO-Abstract]` - -=== References - -* https://se-edu.github.io/se-book/oop/inheritance/abstractClasses/[se-edu/se-book: Paradigms: OOP: Abstract Classes] -* https://se-edu.github.io/se-book/cppToJava/inheritance/abstractClassesAndMethods/[se-edu/se-book: C++ to Java: OOP: Abstract Classes] - -=== Exercise: Make `Command#execute()` method abstract - -* Make the `Command#execute()` method abstract (hint: refer to the comment given below the method) - -== Use interfaces `[LO-Interfaces]` - -Note how the `AddressBook` class implements the `ReadOnlyAddressBook` interface so that clients who don't need write access to the `AddressBook` can access the `AddressBook` through the `ReadOnlyAddressBook` interface instead. - -image::ReadOnlyAddressBookUsage.png[width=500] - -=== References - -* https://se-edu.github.io/se-book/oop/inheritance/interfaces/[se-edu/se-book: Paradigms: OOP: Abstract Interfaces] -* https://se-edu.github.io/se-book/cppToJava/inheritance/interfaces/[se-edu/se-book: C++ to Java: OOP: Abstract Interfaces] - -=== Exercise: Add a `Printable` interface - -* Add a `Printable` interface as follows. -+ -image::PrintableInterface.png[width=400] -* `Override` the `getPrintableString` in classes `Name`, `Phone`, `Email`, and `Address` so that each produces a printable string representation of the object. e.g. `Name: John Smith`, `Phone: 12349862` -* Add the following method in a suitable place of some other class. Note how the method depends on the Interface. -+ -[source,java] ----- -/** - * Returns a concatenated version of the printable strings of each object. - */ -String getPrintableString(Printable... printables) { ----- -+ -The above method can be used to get a printable string representing a bunch of person details. -For example, you should be able to call that method like this: -+ -[source,java] ----- -// p is a Person object -return getPrintableString(p.getPhone(), p.getEmail(), p.getAddress()); ----- - -== Follow Liskov Substitution Principle `[LO-LSP]` - -=== References - -* https://se-edu.github.io/se-book/principles/liskovSubstitutionPrinciple/[se-edu/se-book: Principles: Liskov Substitution Principle] - -=== Exercise: Add an exception to an overridden method - -* Add a `throws Exception` clause to the `AddCommand::execute` method. Notice how Java compiler will not allow it, -unless you add the same `throws` clause to the parent class method. This is because if a child class throws -an exception that is not specified by the Parent's contract, the child class is no longer substitutable in place of -the parent class. -* Also note that while in the above example the compiler enforces LSP, there are other situations where it is up to -the programmer to enforce it. For example, if the method in the parent class works for `null` input, the overridden -method in the child class should not reject `null` inputs. This will not be enforced by the compiler. - -== Use Java-FX for GUI programming `[LO-JavaFx]` - -=== References - -* https://se-edu.github.io/se-book/javaTools/javaFXBasic/[se-edu/se-book: Tools: Java: JavaFX: Basic] - -=== Exercise: Enhance GUI - -* Do some enhancements to the AddressBook GUI. e.g. add an application icon, change font size/style - -== Analyze Coupling and Cohesion of designs `[LO-CouplingCohesion]` - -* Notice how having a separate `ParserUtil` class to handle user input validation, space trimming etc. of model data (an application of the Single Responsibility Principle) improves the _cohesion_ of the model component (since it does not need to be concerned with handling user input) as well as the `ParserUtil` class. - -=== References - -* https://se-edu.github.io/se-book/designFundamentals/coupling/[se-edu/se-book: Design: Design Principles: Coupling] -* https://se-edu.github.io/se-book/designFundamentals/cohesion/[se-edu/se-book: Design: Design Principles: Cohesion] - -=== Exercise: Identify places to reduce coupling and increase cohesion - -* Where else in the design coupling can be reduced further, or cohesion can be increased further? - -[[apply-dependency-inversion-principle-lo-dip]] -== Apply Dependency Inversion Principle `[LO-DIP]` - -* Note how the `LogicManager` class doesn't depend on `StorageManager` directly, but rather the interface `Storage`. -This is an application of the Dependency Inversion Principle. -+ -image::LogicStorageDIP.png[width=300] -* Where else in the code do you notice the application of DIP? - -=== References - -* https://se-edu.github.io/se-book/principles/dependencyInversionPrinciple/[se-edu/se-book: Principles: Dependency Inversion Principle] - -== Use Dependency Injection `[LO-DI]` - -Notice how the `LogicManager` class does not depend on the `StorageManager` class, but depends on the `Storage` interface. -This allows us to use _Dependency Injection_ to test the `LogicManager` class without getting the `StorageManager` class involved. - -=== References - -* https://se-edu.github.io/se-book/testing/dependencyInjection/[se-edu/se-book: Quality Assurance: Testing: Dependency Injection] - -=== Exercise: Facilitate injecting a StorageStub - -* Notice how `LogicManagerTest` tests `LogicManager` by constructing a `StorageManager` object. -* Implement `StorageStub` such that calls to its `save*` methods do nothing (i.e. empty method body). -* Update `LogicManagerTest` to work with the `StorageStub` instead of the actual `StorageManager` object. -i.e. `LogicManagerTest` injects a `StorageStub` object when constructing a `LogicManager` before testing it. -+ -image::DependencyInjection.png[width=600] -* The example above uses <> as a means to achieve DI. -Note that there is another way to inject a `StorageStub` object, as shown below. -In this case we do not apply the DIP but we still achieve DI. -+ -image::DependencyInjectionWithoutDIP.png[width=250] - -== Apply Open-Closed Principle `[LO-OCP]` - -=== References - -* https://se-edu.github.io/se-book/principles/openClosedPrinciple/[se-edu/se-book: Principles: Open-Closed Principle] - -=== Exercise: Analyze OCP-compliance of the `LogicManager` class - -* Consider adding a new command to the Address Book. e.g. an `edit` command. Notice how little you need to change in the `LogicManager` class to extend its behavior so that it can execute the new command. -That is because `LogicManager` follows the OCP i.e. `LogicManager` is _open to be extended_ with more commands but _closed for modifications_. -* Is it possible to make the `AddressBookParser` class more OCP-compliant in terms of extending it to handle more -command types? -* In terms of how it saves data, is `LogicManager` more OCP-compliant -due to the application of DIP as given in <>? -How can you improve ``LogicManager``'s OCP-compliance further so that it can not only work with different types -of storages, but different number of storages (e.g. save to both a text file and a database). - -== Work in a 3KLoC code base `[LO-3KLoC]` - -=== Exercise: Enhance AddressBook - -* Enhance AddressBook in some way. e.g. add a new command diff --git a/docs/README.adoc b/docs/README.adoc new file mode 100644 index 00000000000..a65ae663288 --- /dev/null +++ b/docs/README.adoc @@ -0,0 +1,2 @@ +:stylesDir: stylesheets +include::../README.adoc[] diff --git a/docs/README.html b/docs/README.html new file mode 100644 index 00000000000..0d766ca84d0 --- /dev/null +++ b/docs/README.html @@ -0,0 +1,2271 @@ + + + + + + + + + Study Buddy + + + + + +
+
+

Introduction

+
+
+

Build Status

+
+
+
+ Ui +
+
Figure 1. UI Sample Picture, will be updated in ther future
+
+
+

What is Study Buddy ?

+
+
    +
  • +

    Study Buddy is a task management tool for students who wish to organise their tasks more + efficiently.

    +
  • +
  • +

    With the help of Study Buddy, students can easily view and manage their module related + tasks.

    +
  • +
  • +

    Sort, filter and search commands are also provided to make the interaction more + useful.

    +
  • +
  • +

    It also provides services to show the statistics for time, grades breakdown and workload + comparison between different + modules in Pie charts. This visualisation of data helps students become more aware of + their Pending work and which tasks to spend more time on.

    +
  • +
+
+
+
+

Who can benefit most from Study Buddy?

+
+
+
+
    +
  • +

    It is designed for students who can type fast and are comfortable with Command-Line + Interface(CLI).

    +
  • +
+
+
+
+
+
+

What is CLI?

+
+
    +
  • +

    CLI is a command line program that accepts text input to execute operating system + functions.

    +
  • +
  • +

    Compare with graphical user interfaces(GUI), CLI performs interaction with user by + keyboard input instead of + mouse clicking, such as command window.

    +
  • +
+
+
+
+
+
+

Site Map

+
+
+

To browse more information, please check our site map:

+
+
+ +
+
+
+
+

Acknowledgements

+
+
+ +
+
+
+
+ + + diff --git a/docs/SettingUp.adoc b/docs/SettingUp.adoc index c0659782fab..c790e1b97f5 100644 --- a/docs/SettingUp.adoc +++ b/docs/SettingUp.adoc @@ -1,4 +1,4 @@ -= AddressBook Level 3 - Setting Up += Study Buddy - Setting Up :site-section: DeveloperGuide :toc: :toc-title: @@ -12,7 +12,7 @@ ifdef::env-github[] :note-caption: :information_source: :warning-caption: :warning: endif::[] -:repoURL: https://github.com/se-edu/addressbook-level3/tree/master +:repoURL: https://github.com/AY1920S2-CS2103T-W16-3/main == Prerequisites @@ -21,7 +21,8 @@ endif::[] + [NOTE] IntelliJ by default has Gradle and JavaFx plugins installed. + -Do not disable them. If you have disabled them, go to `File` > `Settings` > `Plugins` to re-enable them. +Do not disable them. +If you have disabled them, go to `File` > `Settings` > `Plugins` to re-enable them. == Setting up the project in your computer @@ -31,35 +32,39 @@ Do not disable them. If you have disabled them, go to `File` > `Settings` > `Plu .. Click `Configure` > `Project Defaults` > `Project Structure` .. Click `New...` and find the directory of the JDK . Click `Import Project` -. Locate the `build.gradle` file and select it. Click `OK` +. Locate the `build.gradle` file and select it. +Click `OK` . Click `Open as Project` . Click `OK` to accept the default settings. == Verifying the setup -. Run the `seedu.address.Main` and try a few commands +. Run the `studybuddy.Main` and try a few commands . <> to ensure they all pass. == Configurations to do before writing code === Configuring the coding style -This project follows https://github.com/oss-generic/process/blob/master/docs/CodingStandards.adoc[oss-generic coding standards]. IntelliJ's default style is mostly compliant with ours but it uses a different import order from ours. To rectify, +This project follows https://github.com/oss-generic/process/blob/master/docs/CodingStandards.adoc[oss-generic coding standards]. +IntelliJ's default style is mostly compliant with ours but it uses a different import order from ours. +To rectify, . Go to `File` > `Settings...` (Windows/Linux), or `IntelliJ IDEA` > `Preferences...` (macOS) . Select `Editor` > `Code Style` > `Java` . Click on the `Imports` tab to set the order * For `Class count to use import with '\*'` and `Names count to use static import with '*'`: Set to `999` to prevent IntelliJ from contracting the import statements -* For `Import Layout`: The order is `import static all other imports`, `import java.\*`, `import javax.*`, `import org.\*`, `import com.*`, `import all other imports`. Add a `` between each `import` +* For `Import Layout`: The order is `import static all other imports`, `import java.\*`, `import javax.*`, `import org.\*`, `import com.*`, `import all other imports`. +Add a `` between each `import` Optionally, you can follow the <> document to configure Intellij to check style-compliance as you write code. === Updating documentation to match your fork -After forking the repo, the documentation will still have the SE-EDU branding and refer to the `se-edu/addressbook-level3` repo. +After forking the repo, the documentation will still have the DRAGANDDROP branding and refer to the `draganddrop/studybuddy` repo. -If you plan to develop this fork as a separate product (i.e. instead of contributing to `se-edu/addressbook-level3`), you should do the following: +If you plan to develop this fork as a separate product (i.e. instead of contributing to `draganddrop-studybuddy`), you should do the following: . Configure the <> in link:{repoURL}/build.gradle[`build.gradle`], such as the `site-name`, to suit your own project. @@ -67,7 +72,8 @@ If you plan to develop this fork as a separate product (i.e. instead of contribu === Setting up CI -Set up Travis to perform Continuous Integration (CI) for your fork. See <> to learn how to set it up. +Set up Travis to perform Continuous Integration (CI) for your fork. +See <> to learn how to set it up. After setting up Travis, you can optionally set up coverage reporting for your team fork (see <>). @@ -81,4 +87,4 @@ Having both Travis and AppVeyor ensures your App works on both Unix-based platfo === Getting started with coding -When you are ready to start coding, we recommend that you get some sense of the overall design by reading about <>. +When you are ready to start coding, we recommend that you get some sense of the overall design by reading about <>. diff --git a/docs/Testing.adoc b/docs/Testing.adoc index 5767b92912c..49fa5042f87 100644 --- a/docs/Testing.adoc +++ b/docs/Testing.adoc @@ -1,4 +1,4 @@ -= AddressBook Level 3 - Testing += Study Buddy - Testing :site-section: DeveloperGuide :toc: :toc-title: @@ -12,7 +12,7 @@ ifdef::env-github[] :note-caption: :information_source: :warning-caption: :warning: endif::[] -:repoURL: https://github.com/se-edu/addressbook-level3/tree/master +:repoURL: https://github.com/AY1920S2-CS2103T-W16-3/main == Running Tests @@ -34,15 +34,16 @@ See <> for more info on how to run tests using G We have three types of tests: -. _Unit tests_ targeting the lowest level methods/classes. + -e.g. `seedu.address.commons.StringUtilTest` -. _Integration tests_ that are checking the integration of multiple code units (those code units are assumed to be working). + -e.g. `seedu.address.storage.StorageManagerTest` -. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together. + -e.g. `seedu.address.logic.LogicManagerTest` - +. _Unit tests_ targeting the lowest level methods/classes. + +e.g. `draganddrop.address.commons.StringUtilTest` +. _Integration tests_ that are checking the integration of multiple code units (those code units are assumed to be working). + +e.g. `StorageManagerTest` +. Hybrids of unit and integration tests. +These test are checking multiple code units as well as how the are connected together. + +e.g. `LogicManagerTest` == Troubleshooting Testing + **Problem: Keyboard and mouse movements are not simulated on macOS Mojave, resulting in GUI Tests failure.** * Reason: From macOS Mojave onwards, applications without `Accessibility` permission cannot simulate certain keyboard and mouse movements. diff --git a/docs/UserGuide.adoc b/docs/UserGuide.adoc index 4e5d297a19f..6d974daaea7 100644 --- a/docs/UserGuide.adoc +++ b/docs/UserGuide.adoc @@ -1,6 +1,8 @@ -= AddressBook Level 3 - User Guide += Study Buddy - User Guide :site-section: UserGuide :toc: +:toclevels: 4 +:bl: pass:[ + :toc-title: :toc-placement: preamble :sectnums: @@ -11,167 +13,1391 @@ ifdef::env-github[] :tip-caption: :bulb: :note-caption: :information_source: +:caution-caption: :fire: +:important-caption: :heavy_exclamation_mark: endif::[] -:repoURL: https://github.com/se-edu/addressbook-level3 +:repoURL: https://github.com/AY1920S2-CS2103T-W16-3/main +:javaVersionURL_win: https://www.wikihow.com/Check-Your-Java-Version-in-the-Windows-Command-Line +:javaVersionURL_mac: https://www.wikihow.com/Check-Java-Version-on-a-Mac +:javaInstallURL_win: https://docs.oracle.com/en/java/javase/11/install/installation-jdk-microsoft-windows-platforms.html#GUID-C11500A9-252C-46FE-BB17-FC5A9528EAEB +:javaInstallURL_mac: https://docs.oracle.com/en/java/javase/11/install/installation-jdk-macos.html#GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE +:jdk_bug_report: https://bugs.openjdk.java.net/browse/JDK-8198830 -By: `Team SE-EDU` Since: `Jun 2016` Licence: `MIT` +By: `Team Drag&Drop` Since: `Jan 2020` +//updated by Souwmyaa +//tag::introduction[] == Introduction +(Contributed by Souwmyaa) + -AddressBook Level 3 (AB3) is for those who *prefer to use a desktop app for managing contacts*. More importantly, AB3 is *optimized for those who prefer to work with a Command Line Interface* (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps. Interested? Jump to the <> to get started. Enjoy! +Study Buddy is a desktop application which is designed for students who *wish to manage their module related tasks*. +More importantly, Study Buddy is *optimized for those who prefer to work with a Command Line Interface* (CLI) while still having the benefits of a Graphical User Interface (GUI). This means that while you primarily interact with Study Buddy through text based commands, each command executed will evoke a visual response as well. +You will never have to remember long, wordy commands to use your command line interface, since Study Buddy *provides an interactive way of communication*. +This not only helps prevent typos, but also makes the application much easier to use! + +If you can type fast, Study Buddy can get your module management done faster than traditional GUI apps. + +The purpose of this document is to explain in detail, how users can utilize the various commands and functions that Study Buddy provides. + +Currently, we support both Windows and Mac operating systems. +If you are interested, please jump to the <> to get started. + +Hope you enjoy! +//end::introduction[] + +//tag::quickStart[] == Quick Start -. Ensure you have Java `11` or above installed in your Computer. -. Download the latest `addressbook.jar` link:{repoURL}/releases[here]. -. Copy the file to the folder you want to use as the home folder for your Address Book. -. Double-click the file to start the app. The GUI should appear in a few seconds. +(Contributed by Yuting) + +. Study Buddy relies on a particular computer environment to operate correctly, thus to enjoy it, you need to have `Java 11` or above installed in your computer. +- Here is the guideline for checking java version of your computer. +* link:{javaVersionURL_win}[windows] +* link:{javaVersionURL_mac}[mac] +- If your computer does not have java or its version is below `Java 11`, you may refer to the guide below. +* link:{javaInstallURL_win}[windows] +* link:{javaInstallURL_mac}[mac] +. When your computer is ready, you can download the latest link:{repoURL}/releases[`studybuddy.jar`] to get your Study Buddy. +. To better manage your tasks, you may copy the file to the folder you want to use as the home folder for the Study Buddy. +. Last, double-click the file to start the app and the dashboard should appear in a few seconds. + -image::Ui.png[width="790"] +image::Ui.png[width="790",align="center",title="Study Buddy Dashboard"] + -. Type the command in the command box and press kbd:[Enter] to execute it. + -e.g. typing *`help`* and pressing kbd:[Enter] will open the help window. -. Some example commands you can try: +. Jump to <> to get more information about dashboard. +. To view a list of the available commands, you can key in *`help`* and click kbd:[Enter]. +A more detailed description of our features is available in +<> of this document. +//end::quickStart[] + + +//updated by Souwmyaa +//tag::symbols[] +==== Commonly Used Symbols +(Contributed by Souwmyaa) + + +[NOTE] +This symbol indicates something you should take note of. + +[TIP] +This symbol indicates a tip that you could use. + +[CAUTION] +This symbol indicates an aspect that should be used with caution. + +[IMPORTANT] +This symbol indicates something to which we want to draw your attention. +//end::symbols[] + +//updated by Souwmyaa +//tag::usefulTips[] +==== Useful tips +(Contributed by Souwmyaa) + + +* You may need to adjust the size of the Study Buddy window when you launch it. +* The scroll bar on the right of the response box can be used to view the entire reply. +* At any point during the execution of a command, you can use `quit` to quit the command and start over/try a different command. +* Study Buddy will analyze your input and reply accordingly. +It utilizes an "interactive command prompt". (explained in each command's description under <>) +* In this document, kbd:[enter] indicates *the enter key on your keyboard*. +* In this document, *|* indicates an *alternative option* (i.e. A | B implies A or B). +* A task's *index number*, refers to the number displayed on the left of a task in *All Tasks Panel*. +Note that the index of the same task could be different after some commands, such as `filter`, `find` and `sort`. +//end::usefulTips[] + + +//tag::intro[] +== User Interface Introduction +(Contributed by Yuting, Hong Wen & Teik Jun) + +Study Buddy makes use of color schemes and animations to enhance your user experience. + +=== Dashboard + +The *dashboard* is the landing page each time the application is launched. + +It consists of different components that can interact with you and provide you with meaningful information. + +==== Navigation Menu Bar + +The *menu bar* is located at the top of the dashboard and is primarily used for navigation. + +image::dashboard/nav_bar.png[width="790",align="center",title = "Menu bar"] + +Shortcuts are available for navigating to each page: + +kbd:[F1] - Modules + +kbd:[F3] - Statistics + +kbd:[F4] - Calendar + +kbd:[F5] - Productivity + +kbd:[F6] - StudyBuddy (All Tasks) -* *`list`* : lists all contacts -* **`add`**`n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : adds a contact named `John Doe` to the Address Book. -* **`delete`**`3` : deletes the 3rd contact shown in the current list -* *`exit`* : exits the app -. Refer to <> for details of each command. +==== All Tasks Panel + +By default, the *All Tasks Panel* lists all unarchived task tasks with their detailed information in the order of creation date and time. + +image::dashboard/all_tasks.png[width="600",align="center",title = "All Tasks Panel"] + +===== Task Badges + +To highlight `Module code`, `Task Type` and `Task Status` of each task in the *All Tasks list* , we use *Badges*. + +Module Badges:: +* All in light steelblue. +* If the task is not related to any module, the Module Badges will be omitted. + +Task Type Badges:: +* Badges of different types are in different colours. + +Task Status:: +* Badges of different status types are in different colours. +* Tasks that are due within a week (i.e. 7 days) will be marked as `Due Soon`. +You may need to use the refresh command (<>) to refresh the status of all your tasks. + +==== Tasks Due Soon Panel + +The tasks that are due within a week (i.e. 7 days) will be listed here. +You can jump to <> to get more details. + +image::dashboard/due_soon.png[width="600",align="center",title = "Task Due Soon Panel"] + +===== Task Badges + +To highlight the `Weight & Module Code`, +`Time left for deadline` and `Task Type` of each task in the *Tasks Due Soon Panel* , we use *Badges*. + +Weight & Module Code:: +* All in steelblue. +* Display the weight and module code of a task. + +Time left for deadline:: +* All in light orange. +* Display the time left for a tasks' deadline. +* More information please refer to <> + +Task Type Badges:: +* Badges of different types are in different colors. + +==== Interactive Prompt Box + +The *Interactive Prompt Box* can be found at the bottom of the user interface. + +To interact with Study Buddy, you can enter the desired command in the box with the words `Please enter your command here...` +and press kbd:[enter] to execute. + +The reply from Study Buddy will be displayed in the box above. + +image::dashboard/prompt_box.png[width="790",align="center",title = "Interactive Prompt Box"] + +[NOTE] +To get more detailed information about how to use Study Buddy, please refer to <>. +//end::intro[] [[Features]] == Features +=== Basic features + +==== Help + +This function displays a list of interactive commands that you can use. +It also provides a link to this document, (our user guide). + +[TIP] +This is the command you should use if you are unsure of what to type for a certain command. + +*Example:* + +Say you have forgotten the format of a command and need some help. + +Study Buddy provides a help command for your convenience! + +To `help`: + +. Initiate the command using keyword `help` +. Study Buddy should respond with: ++ +image::basic/help/help_rep.png[width="790",align="center",title="Response to 'help'"] + +[TIP] +Remember to scroll down to see the entire reply. + +//tag::add[] +==== Add +(Contributed by Yuting) + +This command enables you to add a new task into Study Buddy. + +- Through the interaction, task's details will be collected. +.. Required information: task name, task type, task deadline or duration +.. Optional information: module, task description, task weight, estimated number of hours needed +.. Input format requirement: ++ +[cols="1,2,1",options="header"] +|=== +|Information Type |Format Requirement| Example + +|`MODULE CODE` +|2 or 3 letters + 4 digits + 1 letter (optional) +|CS2101, CS2103T, + + LSM1101 + +|`INDEX NUMBER OF + +MODULE` +|Integer number +|1 + +|`TASK NAME` +|No more than 20 characters +|Demo presentation + +|`INDEX NUMBER OF + +TASK TYPE` +|Integer number +|1 + +|`TASK DEADLINE + +OR DURATION` +| Different task types apply different date and time format + +Deadline (for Assignment): + +`HH:mm dd/MM/yyyy` + +Duration (for other task types): + + `HH:mm dd/MM/yyyy-HH:mm dd/MM/yyyy` + + +`HH -> hour, mm -> minutes, dd -> date, mm -> month, +yyyy -> year` +|Assignment: + +23:59 01/05/2020 + +Meeting: + +14:0 15/04/2020-16:0 15/04/2020 + +|`TASK DESCRIPTION` +|No more than 300 characters +|this is a valid description + +|`TASK WEIGHT` +|Positive integer or float number from 0.0 to 100.0 +|12.0 + +|`ESTIMATED NUMBER OF HOURS NEEDED` +|Positive integer or float number +|10.0 +|=== ++ +.. Other constraints:: +... The application does not allow you to enter a name that has special characters (any character that is not a letter in the alphabet). +... The application does not allow you to assign date time that has already passed to a task. +It must be a time in the future. +... For duration, the two dates should follow the order of `start date`-`end date`, the `end date` should be later than `start date`. +... The total weight of tasks under the same module is capped at 100.0. +* Both `archived` and `not archived tasks` will be taken into consideration. +* This constraint also applies to tasks without module information. +Those tasks will be treated as from a same extra module. +It is designed for you to practice your time management skill :). +... All `index numbers` entered should be positive and within a valid range. (i.e When there is only 5 modules available, the valid module index number range is 1 to 5). +... The "Required Information" cannot be empty, on the other hand, you can press kbd:[enter] to skip the "Optional Information". +.. Adding duplicate tasks: +... Look at <> for more information. + +To `add`: + +. Initiate the command using keyword `add` + kbd:[enter]. +. Study Buddy should start with asking module information with `a list of available modules` as: ++ +image::basic/add/add_module.png[width="790",align="center",title="Reponse to 'add', asks for module"] ++ +. You can link this task with a module by entering its `MODULE CODE` | `INDEX NUMBER OF MODULE` here , or you can press kbd:[enter] to skip. +Here we use "1" (CS2101) as an example. +. After the selection of module, Study Buddy should ask for the task name. +Here we use "new task" as an example. +. After entered the task's name and press kbd:[enter], Study Buddy should prompt for task type with the list of available types as: ++ +image::basic/add/add_task_type.png[width="790",align="center",title="Asks for task's type"] ++ +. You can use the `INDEX NUMBER` here to choose a task type. +Here we use "1" (Assignment) as an example. +. After the selection of task type, Study Buddy will prompt for new task's date-time information together with the type related date-time format (i.e. different task types support different date-time formats). +Here we use "14:00 04/05/2020" as an example. + +. Next, Study Buddy should ask for the new task's description, and we use "new task description" as an example. +. Then, Study Buddy should ask for the new task's weight. +Here we use "10" as an example. +. Next, Study Buddy will prompt for the estimated number of hours needed for this new task. +Here we use "10" as an example. +. Once you specify the estimated time needed and press kbd:[enter], Study Buddy should respond with the task details collected and ask for your confirmation to add the task as: ++ +image::basic/add/add_task_info_1.png[width="790",align="center",title="Asks for user conformation to add a new task"] ++ +image::basic/add/add_task_info_2.png[width="790",align="center",title="Task details collected"] ++ +. Now, by pressing kbd:[enter] the new task will be added into your Study Buddy. +Meanwhile, the *All Tasks Panel* will update accordingly. +For this example, the panel should update as below. ++ +image::basic/add/add_result.png[width="790",align="center",title="New task added"] + +[TIP] +Remember, you can use `quit` command to quit at any step. +//end::add[] + + +//updated by Souwmyaa +//tag::addDuplicates[] +==== Add duplicates +(Contributed by Souwmyaa) + + +This command accounts for you adding duplicate tasks. +When you attempt to add a duplicate, the name will be modified slightly so that you can differentiate them. + +*Example:* + +Say you have tried to add a task, you enter all the fields needed and at the end, you realise that you have already added this task. + +Study Buddy lets you add duplicate tasks with a slight modification! +So, now you can add the task and edit it as needed. + +[NOTE] +A task is considered duplicate when the name, type, module, description, weightage, estimated time cost and deadline are the same. + +[IMPORTANT] +This feature is case sensitive i.e if you have one task named "Homework" and another named "homework", they will be considered to be different. + +To `add duplicates`: + +. Follow the same steps as in <>, but enter a duplicate task. +. Study Buddy should respond with: ++ +image::duplicate/addDuplicate.png[width="790",align="center",title="Reponse to adding a duplicate"] ++ +. Type in `yes` if you would like to continue and `no` if you do not. +. If you type `yes` and press kbd:[enter] +. The Study Buddy should respond with: ++ +image::duplicate/addDuplicate1.png[width="790",align="center",title="Response to adding duplicate"] ++ +. As you can see in the snippet above, Study Buddy will append a number in brackets to the task name. +This number corresponds to the number of times this task name has been duplicated. ++ +[NOTE] +If you add two duplicates of a task (eg: task(1) and task(2)), and then delete task(1), when u try to duplicate it again, it will get added as task(3). +The number will not reset to 2, because this is the third time you are attempting to duplicate. + +. If you choose to enter `no` at step 2, this is what you will see. ++ +image::duplicate/addDuplicate2.png[width="790",align="center",title="Response to choosing not to add"] + +[TIP] +You can view all tasks that have been auto-edited this way, using the <> + +[TIP] +Use the <> to edit your duplicated tasks! +//end::addDuplicates[] + +//tag::edit[] +==== Edit +(Contributed by Yuting) + +This command is for you to edit an existing task. +To indicate the task you want to edit, you need to provide its index number. + +*Example:* + +Say when there are some typo in an existing task. +You can use this command to edit as you wish. + +==== +*Constraints* + +. Each new value entered will be checked under the same constrain of add command. +More info you can refer from <>. +. When editing weight or module, the application will also make sure the total weight of related module's tasks will not overflow (i.e. exceed 100). +. You cannot edit a task to be a duplicate. i.e all the fields cannot be the same as a task that already exists. +. Due to the `deadline/Duration format` is different from `Assignment` to `Other Task Types`, we currently don't support: +.. `Assignment` -> `Another Tsk Type` editing +.. `Another Tsk Type` -> `Assignment` editing +==== + +To `edit`: + +. Initiate the command using keyword `edit` + kbd:[enter]. +. Study Buddy should start the task editing interaction by asking you the index number of the desired task. +Here use "1" (Homework 1) as an example. +. When you specified the target task, Study Buddy should continue the interaction by prompting you with the list of editable information. +You can choose any of them via an index number. +Here we use "2" (Task name) as an example. ++ +image::basic/edit/edit_response_index.png[width="790",align="center",title="List of editable fields"] ++ +. After you selected the field to edit, Study Buddy should asks you for the new value. +For this example, let's use "Updated Task" as the new task name. +. Once you specified the updated information and press kbd:[enter], the updated record will be captured, and the *All Tasks Panel* will update automatically. +For this example, the panel should update as below. ++ +image::basic/edit/edit_result.png[width="790",align="center",title="Task edited"] +//end::edit[] + +==== Done + +(Contributed by Hong Wen) + +//tag::Done[] + +This command is for you to mark a task as *Finished*. + ==== -*Command Format* +*Constraints* -* Words in `UPPER_CASE` are the parameters to be supplied by the user e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`. -* Items in square brackets are optional e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`. -* Items with `…`​ after them can be used multiple times including zero times e.g. `[t/TAG]...` can be used as `{nbsp}` (i.e. 0 times), `t/friend`, `t/friend t/family` etc. -* Parameters can be in any order e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable. +. A *Finished* task cannot be marked as *Finished* again. ==== -=== Viewing help : `help` +To `done`: + +. Key in `done` and press kbd:[enter], you should get this prompt: ++ +image::basic/done/done_index.png[width="790",align="center",title = "Asks for task index."] ++ +. Now key in the index of the task you wish to complete. ++ +. Press kbd:[enter] again to confirm your change. ++ +image::basic/done/done_confirm.png[width="790",align="center",title = "Asks for confirmation"] + +. Task set to `Finished` successfully! +Note that the task in your task list has the tag `Finished`. ++ +image::basic/done/done_result.png[width="790",align="center",title = "Done result"] + +[NOTE] +You can choose to archive your completed task using the `archive` command. +Check more details from <>. +//end::Done[] + +//updated by Souwmyaa +//tag::clear[] +==== Clear +(Contributed by Souwmyaa) + + +This commands clears all data in the Study Buddy. + +[CAUTION] +Be careful with this command! +It will remove any data you may have entered into the Study Buddy and you cannot retrieve it. + +*Example:* + +Say you have finished a semester and would like to clear everything in your Study Buddy and start over. + +You can always clear everything! + +To `clear`: + +. Initiate the command using keyword `clear` +. Study Buddy should respond with: ++ +image::basic/clear/clear_confirm.png[width="790",align="center",title="Response to 'clear'"] ++ +. Type yes and hit kbd:[enter] again to confirm +. Study Buddy has been cleared completely! ++ +image::basic/clear/clear_result.png[width="790",align="center",title="View empty Study Buddy"] ++ +. At step 2, if you choose to type no and hit kbd:[enter], this is what you will see. ++ +image::basic/clear/clear_no_result.png[width="790",align="center",title="Response to choosing not to clear"] +//end::clear[] + +//updated by Souwmyaa +//tag::delete[] +==== Delete +(Contributed by Souwmyaa) + + +This commands deletes a task from the existing list, using the index provided by you. Index simply refers to the number on the left of the task in the `All Tasks` panel. + +[CAUTION] +Once a task is deleted, it cannot be retrieved. +Use this command with caution! + +*Example:* + +After having added a task, you realise that there has been a change and you do not need to do that task anymore. + +Study Buddy provides you an option to delete that task from the list! + +To `delete`: + +. Initiate the command using keyword `delete` +. Study Buddy should respond with: ++ +image::basic/delete/delete_index.png[width="790",align="center",title="Response to 'delete'"] + +. Type the index of the task you want to delete. In this case, the index entered is 1. ++ +image::basic/delete/delete_confirm.png[width="790",align="center",title="Asks for confirmation"] +. Press kbd:[enter] again to confirm +. Task has been deleted! +You will notice that the task at the index you selected has disappeared from the list of tasks. ++ +image::basic/delete/delete_result.png[width="790",align="center",title="Updated All Tasks Panel"] +//end::delete[] + +//updated by Souwmyaa +//tag::viewRenamed[] +==== View renamed +(Contributed by Souwmyaa) + + +This commands filters all renamed tasks in the list i.e tasks that have a number appended to their names. + +*Example:* + +Say you want to go back and edit all the renamed tasks in your list. +However, you do not want to scroll through the entire list to find them. + +Study Buddy provides you an option to view all your renamed tasks in the list! -Format: `help` +[IMPORTANT] +You will still need to navigate to the main list and use that index to perform any index based operations (eg: delete, edit etc) -=== Adding a person: `add` +To `view renamed`: -Adds a person to the address book + -Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]...` +. Initiate the command using keyword `view renamed` +. Study Buddy should respond with: ++ +image::basic/viewrenamed/viewRenamed1.png[width="790",align="center",title="Response to 'view renamed'"] + +. Press kbd:[enter] again to confirm +. Renamed tasks have been filtered! ++ +image::basic/viewrenamed/viewRenamed2.png[width="790",align="center",title="Updated list of renamed tasks"] [TIP] -A person can have any number of tags (including 0) +In order to navigate back to the main list, use <> +//end::viewRenamed[] + +//updated by gx-huang +//tag::archive/unarchive[] +==== Archive/ Unarchive -Examples: +(Contributed by gexiang) + -* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` -* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal` +This commands stores the specified task into a separate list. -=== Listing all persons : `list` +*Example:* -Shows a list of all persons in the address book. + -Format: `list` +After a hard days work, you completed some tasks. +You don't want them in your to-do list anymore, but you don't want to delete them; some of the information in the task card could still be useful. -=== Editing a person : `edit` +You can always store them in an archive! -Edits an existing person in the address book. + -Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]...` +To `archive`: + +. Initiate the command using keyword `archive` +. Study Buddy should respond with: ++ +image::basic/archive/archive_index.png[width="790",align="center",title="Response to 'archive'"] +. Type the index of the task you want to archive, here use "1" (Leadership Presentation) as an example. +. Study Buddy will ask for your confirmation before archive the target task. ++ +image::basic/archive/archive_confirm.png[width="790",align="center",title="Asks for confirmation"] +. Press kbd:[enter] again to confirm, the task will be archived and the user interface will update. ++ +image::basic/archive/archive_result.png[width="790",align="center",title="Task is archived successfully"] ++ +. You can view the archived task under the `StudyBuddy` -> `Archived Tasks` tab. ++ +image::basic/archive/check_archive.png[width="790",align="center",title="Navigates to archived tasks"] ++ +image::basic/archive/archive_list.png[width="790",align="center",title="Archived tasks"] **** -* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index *must be a positive integer* 1, 2, 3, ... -* At least one of the optional fields must be provided. -* Existing values will be updated to the input values. -* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative. -* You can remove all the person's tags by typing `t/` without specifying any tags after it. +* To `unarchive` a task, and add it back to the main list, simply follow the same set of commands, but replace the `archive` keyword with `unarchive` +* Remember to use the index in the *Archived Task* instead of *All Tasks* **** -Examples: +[NOTE] +If you attempt to unarchive a task that already exists in the main list, the name will automatically be appended with a number in order to avoid duplication. +This is done in the same way as <> +//end::archive/unarchive[] + +//tag::sort[] +[[Sort]] +==== Sort +(Contributed by Yuting) + +This command is for you to reorder the task list in *All Tasks Panel*. + +==== +Currently you can sort tasks by their:: +* Deadline / Task Start Date +* Task Name +* Creation Date & Time +==== + +*Example* + +When you want to sort all your unarchived tasks by their deadline or start date, you may utilize this command to achieve the desired order. + +To `sort`: + +. Initiate the command using keyword `sort` + kbd:[enter]. +. Study Buddy should provide the list of sorting options as below, and you can use the index number to select the desired sort. +Here we use `1` (Deadline / Task Start Date) as an example. ++ +image::basic/sort/sort_term.png[width="790",align="center",title="Sorting options and the order of the tasks before sort"] +. After the selection, Study Buddy should ask for your confirmation to perform the reorder. +You can press kbd:[enter] again to confirm. +Meanwhile, the tasks in *All Tasks Panel* will be sorted accordingly. ++ +image::basic/sort/sort_result.png[width="790",align="center",title="The order of the tasks after sort"] + +[TIP] +The tasks in *All Tasks Panel* will not change back to the original order by itself. + +You can use `sort` -> `Creation Date & Time` to do so. +//end::sort[] + +//updated by Teik Jun +//tag::find[] +[[Find]] +==== Find +(Contributed by Teik Jun) -* `edit 1 p/91234567 e/johndoe@example.com` + -Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively. -* `edit 2 n/Betsy Crower t/` + -Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags. +Finds tasks whose names contain any of the given keywords. -=== Locating persons by name: `find` +To `find` a task: -Finds persons whose names contain any of the given keywords. + -Format: `find KEYWORD [MORE_KEYWORDS]` +. Initiate the command with `find`. + +. Study Buddy should respond with: ++ +image::basic/find/find_keyword.png[width="790",align="center",title="Response to 'find'"] ++ +. Enter the keyword that you want to search for, e.g. quiz, and press kbd:[enter] to confirm sorting. +. You have found a list of tasks that contain your keyword! ++ +image::basic/find/find_result.png[width="790",align="center",title="Find result"] **** -* The search is case insensitive. e.g `hans` will match `Hans` -* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans` +* The search is case insensitive. e.g `homework` will match `Homework` +* The order of the keywords does not matter. e.g. `CS Homework` will match `Homework CS` * Only the name is searched. -* Only full words will be matched e.g. `Han` will not match `Hans` -* Persons matching at least one keyword will be returned (i.e. `OR` search). e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang` +* Substrings will be matched e.g. `work` will match `Homework` +* Tasks matching at least one keyword will be returned (i.e. `OR` search). e.g. `CS Homework` can return `CS Quiz`, +`Reflection Homework`. **** -Examples: +[TIP] +To navigate back to the full list of tasks, you can use the <> function. +//end::find[] -* `find John` + -Returns `john` and `John Doe` -* `find Betsy Tim John` + -Returns any person having names `Betsy`, `Tim`, or `John` +//updated by Teik Jun +//tag::list[] +[[LIST]] +==== List +(Contributed by Teik Jun) -// tag::delete[] -=== Deleting a person : `delete` +Oh no! +How do I get the original list back after using `find`? +Calm down and use the `list` command! +The `list` command lists all the tasks that have been created in StudyBuddy. -Deletes the specified person from the address book. + -Format: `delete INDEX` +To use the `list` command: -**** -* Deletes the person at the specified `INDEX`. -* The index refers to the index number shown in the displayed person list. -* The index *must be a positive integer* 1, 2, 3, ... -**** +. Initiate the command with `list`. + +. Done! +All your tasks are listed once again! ++ +image::basic/list/list_result.png[width="790",align="center",title="List result"] +//end::list[] + +//updated by Teik Jun +//tag::goal[] +==== Goal +(Contributed by Teik Jun) + +Want to challenge yourself to complete tasks? You can set your daily goal using `goal`. + +To use the `goal` command: + +. Initiate the command with `goal`. StudyBuddy should reply with: ++ +image::productivity/goal1.png[width="790", align="center",title="Prompt after entering `goal`"] + +. Now enter the number of tasks that you want to complete today. +It should be a number between 1 and 100. As usual, hit kbd:[Enter] once you're done. + +. Your goal has been set and reflected on the Daily goal tracker. All the best in achieving it! ++ +image::productivity/goal2.png[width="790", align="center",title="Prompt after entering the number 7"] + +[TIP] +Your daily goal is displayed on the Productivity Page. You can find more information +about the Productivity Page in <>. +//end::goal[] + +//updated by Souwmyaa +//tag::filter[] +[[Filter]] +==== Filter +(Contributed by Souwmyaa) + + +This commands helps you filter your tasks by category. +The two categories available are status and type. + +[NOTE] +Note that Due Soon tasks are already filtered for you. +Refer to <> + +[TIP] +To navigate back to your main list, check out <> + +*Example:* + +Say you want to view a list of all your pending tasks. + +Study Buddy provides an option to filter your list! + +To `filter`: + +. Initiate the command using keyword `filter` +. Study Buddy should respond with: ++ +image::basic/filter/filter_term.png[width="790",align="center",title="Response to 'filter'"] + +. Enter your choice. +If you enter 1, you have chosen to filter by status. ++ +image::basic/filter/filter_status.png[width="790",align="center",title="Response to filter by 'status'"] + +. You can then proceed to choose what status type you would like to filter by. +Here we have filtered by "Pending" as an example. ++ +image::basic/filter/filter_status_result.png[width="790",align="center",title="Response to filter by status tag 'Pending'"] + +. At point 3 above, if you enter 2 instead, you have chosen to filter by task types. ++ +image::basic/filter/filter_type.png[width="790",align="center",title="Response to filter by task 'type'"] + +. Once again, imagine your study buddy currently looks like Figure 30 above. (at point 4) + +. You can then proceed to choose what task type you would like to filter by. +Here we have filtered by "assignment" as an example. ++ +image::basic/filter/filter_type_result.png[width="790",align="center",title="Response to filter by task type 'assignment'"] +//end::filter[] -Examples: +//updated by Souwmyaa +//tag::refresh[] +[[Refresh]] +==== Refresh +(Contributed by Souwmyaa) + -* `list` + -`delete 2` + -Deletes the 2nd person in the address book. -* `find Betsy` + -`delete 1` + -Deletes the 1st person in the results of the `find` command. +This commands refreshes the list of tasks Due Soon as well as status tags. -// end::delete[] -=== Clearing all entries : `clear` +[IMPORTANT] +Due soon list shows tasks due within the next week. +Details are in <> -Clears all entries from the address book. + -Format: `clear` +[NOTE] +Status tags include information on the tasks' status, eg: pending, overdue etc. -=== Exiting the program : `exit` +*Example:* -Exits the program. + -Format: `exit` +Say you left Study Buddy open for a few days. +When you come back, you notice that the time left for the deadline on the Due Soon tasks is not accurate. -=== Saving the data +You can refresh them! + +[TIP] +Anytime you notice an inconsistency in time left/status, use this command! + +To `refresh`: + +. Say this is what Study Buddy looks like and you notice that the task "Homework 1" is still in pending status although it should be in due soon status. ++ +image::basic/refresh/refresh_before.png[width="790",align="center",title="Current state (needs to be refreshed)"] + +. Initiate the refresh command using keyword `refresh` and press kbd:[enter] to confirm the action. +. Tasks have been refreshed! You will notice that the pending task has now moved to the due soon list and the status has been updated. ++ +image::basic/refresh/refresh_result.png[width="790",align="center",title="Refreshed Study Buddy"] +//end::refresh[] + +[NOTE] +After 'refresh', the tasks in *All Tasks Panel* will be sorted by their deadline or start date. + + +//updated by Souwmyaa +//tag::exit[] +==== Exit +(Contributed by Souwmyaa) + + +This command exits from Study Buddy. + +[NOTE] +All your data will be saved and reloaded when you open the application later! +You can find details about this in <> + +*Example:* + +After working all day, you would like to close the application and have a good night's sleep. + +You can always exit the application! + +To `exit`: + +. Initiate the command using keyword `bye` +. Study Buddy should respond with: ++ +image::basic/exit/exit_confirm.png[width="790",align="center",title="Response to 'bye'"] +. Type 'yes' and press kbd:[enter] to exit, the Study Buddy window will close automatically. +. If instead, you type 'no' and press kbd:[enter], this is what you will see, ++ +image::basic/exit/exit_no.png[width="790",align="center",title="Response to choosing not to exit"] + +[TIP] +You can still use `quit` command to go back! +//end::exit[] + +//updated by Souwmyaa +//tag::savingData[] +=== Saving Data +(Contributed by Souwmyaa) + + +Study Buddy data is automatically saved in the hard disk after any command that changes the data. -Address book data are saved in the hard disk automatically after any command that changes the data. + There is no need to save manually. -// tag::dataencryption[] -=== Encrypting data files `[coming in v2.0]` +When the application is closed and re-opened, you should be able to see all the data you have added previously! +//end::savingData[] + +//updated by Souwmyaa +//tag::dueSoon[] +=== Due Soon Tasks +(Contributed by Souwmyaa) + + +The Due Soon task list is always on display in your application under `Study Buddy` -> `All tasks` + +It provides the following functionality: + +. It displays your tasks that are due within the next week. (uses deadline you have provided) ++ +image::duesoon/due_soon.png[width="790",align="center",title="Due Soon List"] + +. It automatically sorts these tasks in an ascending order of deadlines. ++ +image::duesoon/due_soon_sort.png[width="790",align="center",title="Due Soon List Auto-Sort"] + +. It automatically adds applicable tasks when you make changes to your main list, such as add (<>) or delete (<>). + +. It displays a tag with the time left to the deadline. ++ +image::duesoon/due_soon_tag.png[width="790", align="center",title="Due Soon List Time Tags"] + +. It provides a <> function that allows you to refresh time/state of this list if needed. + +[NOTE] +Time left is never displayed in days and minutes. +Hence if the current time is 9:00 am on 01/04/2020 and the task deadline is 9:02 am on 02/04/2020, it will show time left as 1 day. (not 1 day and 2 minutes) + +[NOTE] +Due soon list will never display finished tasks. eg: if you unarchive a completed task, it will not appear in the Due Soon list. +//end::dueSoon[] + + +//tag::Modules[] +=== Modules +(Contributed by Hong Wen) + +The modules page organises your tasks into various modules. +By default (i.e, when there is no module created), the modules page shows the following: + +. *Overview*. +This tab shows all the modules you created. + +. *No Module Allocated*. +This tab shows the list of tasks that has not yet been allocated to any module. +By default, all tasks will show up here if you have not allocated any tasks to the modules. ++ +image::module/module_show.png[width="790",align="center",title = "modules page"] + +==== Navigation + +Navigate to modules page:: +. To navigate to the modules page, click on `Modules` -> `Show Modules` in the menu bar or press kbd:[F1] in your keyboard. ++ +image::module/modules_show_module.png[width="790",align="center",title="Modules dropdown menu"] + +Navigation in modules page:: +. The clicking on the leftmost tab shows the `*Overview*` of all your modules. it displays the module's name and their code. ++ +image::module/module_tab_1.png[width="790",align="center",title = "Module tab `Overview`"] + +. The rightmost tab shows the list of task that has not been allocated to any modules. ++ +image::module/module_tab_3.png[width="790",align="center",title = "Module tab `No Module Allocated`"] + +. The tabs in the middle are modules that you have added to the modules page. ++ +image::module/module_tab_2.png[width="790",align="center",title = "Module tab available modules"] + +==== Functions + +===== Create Modules + +[TIP] +Study Buddy provides tow approaches for user to execute `create module` and `edit module` actions. + +To start the interaction of creating a module, click on `Modules`-> `Create` in the menu bar. + +Alternatively, you can key in `create mods` into the input line. + +image::module/module_nav_create.png[width="790",align="center",title = "Entry of module creation"] + +==== +*Constraints* + +. *Module Name* + +The name of this module cannot be the same as any existing modules. + +. *Module Code Format* + +.. The module code also need to be unique. + +.. The module code should have a 2-3 letter prefix, a 4-digit number, followed by a single postfix. + +* *Correct Module Code Examples* + +LSM1303 + +CS2040C + +IS1103 + +MA1521 + +* *Incorrect Module Code Examples* + +CSSS1234 - Prefix is too long + +C0001 - Prefix is too short + +ZZ12345 - number is more than 4 digits + +A1111XX - Postfix is too long +==== + +To `Create Module`: + +. Click on `Module` -> `Create` or key in `create mods`. +A prompt will show up at the bottom of the screen. ++ +image::module/module_create_name.png[width="790",align="center",title = "Asks for module name"] + +. Key in the name of your module.Here we use "New Module" as an example. +Then Study Buddy will ask for the module code. ++ +image::module/module_create_code.png[width="790",align="center",title = "Asks for module code"] ++ +. Here we use "CSS1234" as an example. ++ +image::module/module_create_confirm.png[width="790",align="center",title = "Asks for confirmation"] + +. Press kbd:[enter] to confirm, and the module page will update accordingly. ++ +image::module/module_create_result.png[width="790",align="center",title= "New Module with code CSS1234 created."] + +Congratulations, you have added a module to your modules page! + +==== Edit Modules + +To start the interaction of editing a module, click on `Modules`-> `Edit` in the menu bar. + +Alternatively, you can key in `edit mods` into the input line. + +image::module/module_nav_edit.png[width="790",align="center",title = "Entry of module editing"] + +Study Buddy provides three module editing options. + +Edit options:: +* Change Module name. +* Change Module code. +* Delete Module. + +==== +*Constraints:* + +. When choosing the module to edit, you need to provide a valid and existed module code. +. When entering the value of new module name or new module code, you need to provide a different valid value. +. The above "valid" judgment follows the same constraints as <>. +==== + +To `Edit Module`: + +. Click on `Module` -> `Edit` key in edit mods. +A prompt will show up to ask the module code of target module. ++ +image::module/module_edit_code.png[width="790",align="center",title = "Asks for module mode"] + +. Key in the code of the module that you want to edit. +Here we use "CSS1234" as an example. +Then Study Buddy will ask for the edit option. ++ +image::module/module_edit_option.png[width="790",align="center",title = "Asks for edit option"] + +. Key in the index of your option. + +.. "1" -> Change Module Name ++ +Key in your new module name and press kbd:[enter] to confirm the editing. +Here we use "Edited Module Name" as an example. + +The module page will update accordingly. ++ +image::module/module_edit_name_result.png[width="790",align="center",title = "Module name editing result"] + +.. "2" -> Change Module Code ++ +Key in your new module code and press kbd:[enter] to confirm the editing. +Here we use "LY3000" as an example. + +The module page will update accordingly. ++ +image::module/module_edit_code_result.png[width="790",align="center",title = "Module code editing result"] ++ +Module code changed! + +.. "3" -> Delete Module ++ +[CAUTION] +After successfully deleting a module, the related tasks will also be affected. ++ +To delete the chosen module, you only need to press kbd:[enter] to confirmed the deletion. +To better showcase the behaviour of deletion, here we use "CS2103T" as an example. + +... Before delete: ++ +image::module/module_delete_before.png[width="790",align="center",title = 'Before delete'] + +... After delete: + +After successfully deleted target module, the module page will update accordingly and switch to +`Overview` page. ++ +If you switch to `No Module Allocated` tab, you'll find the tasks affected by this deletion (i.e. The tasks which belong to the deleted module). ++ +image::module/module_delete_after.png[width="790",align="center",title = 'Checking the affected tasks'] +//end::Modules[] + +//tag::Statistics[] +=== Statistics +(Contributed by Yuting) -_{explain how the user can enable/disable data encryption}_ -// end::dataencryption[] +With all the tasks and modules' information you entered, Study Buddy can provide you with a real-time visualized statistics about: +- Task status +- Module related tasks' deadline/ start date +- Module related tasks' weight + +It utilizes different types of charts to make the information more intuitive. +In addition, the chart is always updated in sync with your task records. +Especially when you execute commands such as +`add` `edit` `delete` `sort` `find` `archive` `done` `list` and `clear`. + +[TIP] +The colour theme will also change randomly, hope you enjoy :) + +[NOTE] +The statistics feature is built on top of the data collected from the basic functionality described in <>. +Which means Study Buddy only supports keyboard input for statistics generating. + +Therefore, even though this feature involves mouse-clicking, it is still designed for a fast typist. + +==== Navigate to Statistics Page + +You can navigate to Statistics page by clicking the *Statistics* from the menu bar. + +image::stats/stats_nav.png[width="790",align="center",title = "Entry of Statistics page"] + +==== Statistics Page User Interface and Interaction + +The left panel contains different charts for different statistics. +You can use the tabs circled in light orange to navigate. + +When you click on a statistics chart, the associated task records will be listed automatically in the right-side panel. + +image::stats/stats_ui.png[width="790",align="center",title = "Statistics Page User Interface "] + +===== Task Status Tab + +Introduction:: +This clickable *pie chart* compares the number of tasks in different statuses. ++ +image::stats/stats_pie.png[width="790",align="center",title = "Task Status Chart"] + +Clicking Action:: +When you click on the chart, all tasks with the selected status will display on the right-side panel automatically. ++ +Here is an example when you are clicking on the *Due Soon* portion. ++ +* The part highlighted by light purple lines represents all your Due Soon tasks. +When you are clicking on it, all tasks with Due Soon status will be listed in the right-side panel. ++ +You can refer to the screenshot below where the relevant information is highlighted for you. ++ +image::stats/stats_pie_click.png[width="790",align="center",title = "Clicking on 'Due Soon' part"] + +===== Module Related Tasks' Deadline/Start Date Tab + +Introduction:: +This clickable *area chart* summarizes the task deadlines or start dates for different modules. ++ +image::stats/stats_area.png[width="790",align="center",title = "Module Related Tasks' Deadline/Start Date Chart"] ++ +==== +Chart Details:: +. The *X-axis* represents a particular date. +. The *Y-axis* represents the number of tasks. +. The *area* (i.e. The triangles or quadrilaterals exclude their vertices) with the same background colour represents the tasks under the same module. +. The *data point* (i.e. The vertices of the triangles or quadrilaterals) represents tasks under a particular module, which will due or start on the same specific data. +. Tasks under different module have a different background colour. +. Only the tasks due or start within *the next 60 days* will display in both chart or right-side panel. +. Since the colour of each module is translucent, "extra" colours may appear as a result of data overlapping. +. When clicking on an overlapping area, only one layer's related records will be listed in the right-side panel. +==== + +Clicking Action:: +After you click on the chart, the related task records will display on the right-side panel automatically. ++ +Here are two different behaviours according to the place you click. + +. *Click on data area*: ++ +The tasks under a particular module will be listed in the right-side panel. ++ +Here is an example when you are clicking on the area of module "CS2101". ++ +* The parts highlighted using light purple lines represents the tasks under module "CS2101". +When you are clicking on those areas, the tasks under CS2101 and will due or start within the next 60 days will display in the right-side panel. ++ +You can refer to the screenshot below where the relevant information is highlighted for you. ++ +image::stats/stats_area_click_area.png[width="790",align="center",title = "Clicking on the area of module 'CS2101'"] + +. *Click on data point*: ++ +The tasks under a particular module and will due or start on a specific date will be listed in the right-side panel. ++ +Here is an example when you are clicking on the data point of tasks under module "CS2101" and will due or start on 13/04/2020. ++ +* The point circled in light purple is the data point you clicked. +After you clicked on this point, the tasks under module "CS2101" and will due or start on 13/04/2020 will display in the right-side panel. ++ +You can refer to the screenshot below where the relevant information is highlighted for you. ++ +image::stats/stats_click_point.png[width="790",align="center",title = "Clicking on the data point of module 'CS2101's tasks which will due or start on 13/04/2020"] + +===== Module Related Tasks' Weight Tab + +Introduction:: +This clickable *stacked bar chart* compares the weight of different types of tasks in each module. ++ +image::stats/stats_bar.png[width="790",align="center",title="Module Related Tasks' Weight Chart"] ++ +==== +Chart Details:: +. The *X-axis* represents different modules. +. The *Y-axis* represents the weight-sum under the same module. +. The *blocks* in each bar represent the total weight of a particular task type. +. Different task type has a different background colour. +==== + +Clicking Action:: +After you click on the chart, the tasks under the selected module and type will display on the right-side panel automatically. ++ +Here is an example when you are clicking on the block which represents the assignments of module "CS2101". ++ +* The block highlighted using light purple lines represents the assignments of module "CS2101". +When you are clicking it, all assignments of module "CS2101" will show in the right-side panel. ++ +You can refer to the screenshot below where the relevant information is highlighted for you. ++ +image::stats/stats_bar_click.png[width="790",align="center",title="Clicking on the block of 'CS2101''s assignments"] + +[NOTE] +As the data of charts are filled dynamically, thus it is possible that their labels can overlap together. + +This is an unfixed bug regarding the JDK which is caused by JavaFX chart off-sync. +To get more information, you may refer to link:{jdk_bug_report}[here]. + +When this issue happens, you can use any command that can trigger chart updating to refresh the chart. +//end::Statistics[] + +//updated by gx-huang +//tag::calendar[] +=== Calendar + +(contributed by gexiang) + +==== +*Constraints* + +. The calendar GUI does not work well if the window size is set too small. +. You will not be able to navigate too far into the past/ future using CLI. + +==== + +The calendar feature allows you to visualise your schedule by displaying the number of task you have for the month. +This allows students to plan their time efficiently. + +The calendar feature can be toggled by clicking `Calendar` from the menu bar. + +image::calendar/calendar_init.png[width="790",align="center",title="calendar interface"] + +* `Previous` and `Next` buttons can be used to navigate through previous and next months respectively. `Current month` button brings you to the current date, which is in a blue border. + +* Clicking on any date will show you all tasks for that day. +Keep in mind that the *Index* shown in this panel cannot be used for other commands. + +image::calendar/calendar_click.png[width="790",align="center",title="calendar after clicking on a date"] + +==== Navigation using CLI + +Study buddy also allows you to navigate to any date in the `Calendar`. + +. To initiate fast navigation, simply key in `calendar` into the input line. +. Study buddy will ask you for a date ++ +image::calendar/Calendar_CLI_Date.png[width="790",align="center",title="Interactive prompt after keying in calendar"] ++ +In this example, we entered `20/04/2020`. +. Input your date using the format shown and press kbd:[enter] once to proceed. +. Press kbd:[enter] again to confirm your command. + +You will now see the calendar for your selected date as well as all the tasks on that day. + +image::calendar/calendar_after_CLI.png[width="790",align="center",title="Successfully navigated calendar using CLI"] +//end::calendar[] + +//updated by Teik Jun +//tag::productivity[] +=== Productivity +(Contributed by Teik Jun) + +The productivity page shows insights related to your productivity over the past day, week and more. +By keeping tabs on your past productivity, you can improve your future productivity. +The productivity feature also gamifies your task management experience. +Doing work has never been more fun! + +==== Daily Productivity Tab +image::productivity/daily_tab.png[width="790",align="center",title="Daily Productivity Tab"] + +To get started, click on the Productivity menu button or type kbd:[F6]. +The daily productivity tab tracks the number of tasks you completed today. +As you complete tasks using the `done` command, you will get closer to your daily goal. + +Completing your goal each day adds to your streak. +Your streak will reset to zero if you fail to complete your goal. + +[TIP] +You can set a daily goal for the number of tasks you want to complete using the command `goal`. +Refer to <> for more details on the `goal` command. +Note that the streak can only be increased once a day, +even if you change your goal after completing your streak. + + +==== Weekly Productivity Tab +image::productivity/weekly_tab.png[width="790",align="center",title="Weekly Productivity Tab"] + +On the weekly productivity tab, you can look back on your progress over the past week. +The weekly tab displays information about your productivity for the past seven days. + +Here, you can keep track of the total number of tasks you completed this week. +You can visualize the number of tasks you completed using the bar chart shown. + +Furthermore, you can keep track of the number of tasks that went overdue this week, +so that you can be more punctual in the future. + +[TIP] +If you complete or add a task while looking at the weekly tab or productivity points tab, +the color theme changes randomly. + +==== Productivity Points Tab + +image::productivity/points-tab.png[width="790",align="center",title="Productivity Points Tab" title-align="center"] + +You can go to this tab directly by clicking your Productivity Point count on the top right of the menu. +The Productivity Points tab displays your current Productivity Points (PP) and your progression. + + +You gain Productivity Points upon adding tasks, completing tasks, and using advanced features in StudyBuddy. +On the other hand, you lose Productivity Points when your tasks go Overdue. + +Here are some examples of how to obtain Productivity Points in StudyBuddy: + +.. Adding a task: _+1_ + +.. Completing a task: _+10_ + +.. Completing your daily goal: _+(points equivalent to daily goal)_ + +.. Using advanced features; _+1_ (Explore StudyBuddy to find out more!) + +.. Letting a task go Overdue: _-1_ + +[TIP] +You start with some productivity points. +They're free! :) + +//end::productivity[] + +//tag::Password[] +=== Password [Coming in v2.0] +(Contributed by ge xiang) + +In order to protect your privacy from shared users of a computer, Study Buddy v2.0 will include a new feature that encrypts your data. +You will be the only one able to view your tasks using your password that you can set optionally. + +Here's how to protect your data: + +. Set a password +. When you exit Study Buddy, your tasks stored in `tasklist.json` will be encrypted. +. The next time you use `Study Buddy`, you will be required to enter the same password and Study Buddy will decrypt the file for you. +. You will have unlimited tries to enter the password. + +[TIP] +Remember to use a strong password! +//end::Password[] + +//updated by Souwmyaa & Teik Jun +//tag::summary[] +[[Summary]] +== Command Summary +(Contributed by Souwmyaa) + + +. help <> +. add <> +. edit <> +. archive <> +. clear <> +. create mods <> +. delete <> +. view renamed <> +. done <> +. find <> +. list <> +. goal <> +. filter <> +. sort <> +. refresh <> +. calendar <> +. bye <> + +//end::summary[] + +//updated by gx-huang +//tag::FAQ[] == FAQ +(Contributed by Teik Jun & ge xiang) *Q*: How do I transfer my data to another Computer? + -*A*: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Address Book folder. +*A*: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Study Buddy folder (should be under data -> taskList.json). -== Command Summary +*Q*: How do I save my data? + +*A*: Study buddy saves your data automatically after every command. + +*Q*: The task I'm trying to delete/archive is in the task list, but study buddy keeps replying that my index is out of range! + +*A*: Check that you are using the index from the "All Tasks" list. This can be accessed from the tab `StudyBuddy` -> `All tasks`. + +Unless you are using the `unarchive` command, use the "Archived list" index found at `StudyBuddy` -> `Archived tasks` instead. + +*Q*: How do I update to the latest version of Study Buddy + +*A*: Simply download the latest `.jar` file released on our GitHub page: + +https://github.com/AY1920S2-CS2103T-W16-3/main/releases -* *Add* `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]...` + -e.g. `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` -* *Clear* : `clear` -* *Delete* : `delete INDEX` + -e.g. `delete 3` -* *Edit* : `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]...` + -e.g. `edit 2 n/James Lee e/jameslee@example.com` -* *Find* : `find KEYWORD [MORE_KEYWORDS]` + -e.g. `find James Jake` -* *List* : `list` -* *Help* : `help` diff --git a/docs/UserGuide.html b/docs/UserGuide.html new file mode 100644 index 00000000000..991d28999f3 --- /dev/null +++ b/docs/UserGuide.html @@ -0,0 +1,3196 @@ + + + + + + + +Study Buddy - User Guide + + + + + +
+ +
+

1. Introduction

+
+
+

Study Buddy is a desktop application which is designed for students who wish to manage their module related tasks. +More importantly, Study Buddy is optimized for those who prefer to work with a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI).

+
+
+

You will never have to remember long, wordy commands to use your command line interface, since Study Buddy provides an interactive way of communication. +This not only helps to prevent typos, but also makes the application much easier to use!

+
+
+

If you can type fast, Study Buddy can get your module management done faster than traditional GUI apps.

+
+
+

Currently, Study Buddy supports both Windows and Mac systems. +If you are interested, please jump to the Section 2, “Quick Start” to get started.

+
+
+

Hope you enjoy!

+
+
+
+
+

2. Quick Start

+
+
+
    +
  1. +

    Study Buddy relies on a particular computer environment to operate correctly, thus to enjoy it, you need to have Java 11 or above installed in your computer.

    +
    +
      +
    • +

      Here is the guideline for checking java version of your computer.

      +
      + +
      +
    • +
    • +

      If your computer does not have java or its version is below Java 11, you may refer to the guide below.

      +
      + +
      +
    • +
    +
    +
  2. +
  3. +

    When your computer is ready, you can download the latest studybuddy.jar to get your Study Buddy.

    +
  4. +
  5. +

    To better manage your tasks, you may copy the file to the folder you want to use as the home folder for the Study Buddy.

    +
  6. +
  7. +

    Last, double-click the file to start the app and the dashboard should appear in a few seconds.

    +
    +
    +Ui +
    +
    Figure 1. Study Buddy Dashboard
    +
    +
  8. +
  9. +

    Jump to Section 3.1, “Dashboard” to get more information about dashboard.

    +
  10. +
  11. +

    To view a list of the available commands, you can key in help and click Enter. +A more detailed description of our features is available in +Section 4, “Features” of this document.

    +
  12. +
+
+
+

2.1. Commonly Used Symbols

+
+ + + + + +
+
Note
+
+This symbol indicates something you should take note of. +
+
+
+ + + + + +
+
Tip
+
+This symbol indicates a tip that you could use. +
+
+
+ + + + + +
+
Caution
+
+This symbol indicates an aspect that should be used with caution. +
+
+
+ + + + + +
+
Important
+
+This symbol indicates something to which we want to draw your attention. +
+
+
+
+

2.2. Useful tips

+
+
    +
  • +

    You may need to adjust the size of the Study Buddy window when you launch it.

    +
  • +
  • +

    The scroll bar on the right of the response box can be used to view the entire reply.

    +
  • +
  • +

    At any point during the execution of a command, you can use quit to quit the command and start over/try a different command.

    +
  • +
  • +

    Study Buddy will analyze your input and reply accordingly. +It utilizes an "interactive command prompt". (explained in each command’s description under Section 4, “Features”)

    +
  • +
  • +

    In this document, enter indicates the enter key on your keyboard.

    +
  • +
  • +

    In this document, | indicates an alternative option (i.e. A | B implies A or B).

    +
  • +
  • +

    A task’s index number, refers to the number displayed on the left of a task in All Tasks Panel. +Note that the index of the same task could be different after some commands, such as filter, find and sort.

    +
  • +
+
+
+
+
+
+

3. User Interface Introduction

+
+
+

Study Buddy makes use of color schemes and animations to enhance your user experience.

+
+
+

3.1. Dashboard

+
+

The dashboard is the landing page each time the application is launched.
+It consists of different components that can interact with you and provide you with meaningful information.

+
+
+

3.1.1. Navigation Menu Bar

+
+

The menu bar is located at the top of the dashboard and is primarily used for navigation.

+
+
+
+nav bar +
+
Figure 2. Menu bar
+
+
+
+

3.1.2. All Tasks Panel

+
+

By default, the All Tasks Panel lists all unarchived task tasks with their detailed information in the order of creation date and time.

+
+
+
+all tasks +
+
Figure 3. All Tasks Panel
+
+
+
Task Badges
+
+

To highlight Module code, Task Type and Task Status of each task in the All Tasks list , we use Badges.

+
+
+
+
Module Badges
+
+
+
    +
  • +

    All in light steelblue.

    +
  • +
  • +

    If the task is not related to any module, the Module Badges will be omitted.

    +
  • +
+
+
+
Task Type Badges
+
+
+
    +
  • +

    Badges of different types are in different colours.

    +
  • +
+
+
+
Task Status
+
+
+
    +
  • +

    Badges of different status types are in different colours.

    +
  • +
  • +

    Tasks that are due within a week (i.e. 7 days) will be marked as Due Soon. +You may need to use the refresh command (Section 4.1.14, “Refresh”) to refresh the status of all your tasks.

    +
  • +
+
+
+
+
+
+
+
+

3.1.3. Tasks Due Soon Panel

+
+

The tasks that are due within a week (i.e. 7 days) will be listed here. +You can jump to Section 4.3, “Due Soon Tasks” to get more details.

+
+
+
+due soon +
+
Figure 4. Task Due Soon Panel
+
+
+
Task Badges
+
+

To highlight the Weight & Module Code, +Time left for deadline and Task Type of each task in the Tasks Due Soon Panel , we use Badges.

+
+
+
+
Weight & Module Code
+
+
+
    +
  • +

    All in steelblue.

    +
  • +
  • +

    Display the weight and module code of a task.

    +
  • +
+
+
+
Time left for deadline
+
+
+ +
+
+
Task Type Badges
+
+
+
    +
  • +

    Badges of different types are in different colors.

    +
  • +
+
+
+
+
+
+
+
+

3.1.4. Interactive Prompt Box

+
+

The Interactive Prompt Box can be found at the bottom of the user interface.

+
+
+

To interact with Study Buddy, you can enter the desired command in the box with the words Please enter your command here…​ +and press enter to execute.

+
+
+

The reply from Study Buddy will be displayed in the box above.

+
+
+
+prompt box +
+
Figure 5. Interactive Prompt Box
+
+
+ + + + + +
+
Note
+
+To get more detailed information about how to use Study Buddy, please refer to Section 4, “Features”. +
+
+
+
+
+
+
+

4. Features

+
+
+

4.1. Basic features

+
+

4.1.1. Help :

+
+

This function displays a list of interactive commands that you can use. +It also provides a link to this document, (our user guide).

+
+
+ + + + + +
+
Tip
+
+This is the command you should use if you are unsure of what to type for a certain command. +
+
+
+

Example:

+
+
+

Say you have forgotten the format of a command and need some help.

+
+
+

Study Buddy provides a help command for your convenience!

+
+
+

To help:

+
+
+
    +
  1. +

    Initiate the command using keyword help

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +help rep +
    +
    Figure 6. Response to 'help'
    +
    +
  4. +
+
+
+ + + + + +
+
Tip
+
+Remember to scroll down to see the entire reply. +
+
+
+
+

4.1.2. Add

+
+

This command enables you to add a new task into Study Buddy.

+
+
+
    +
  • +

    Through the interaction, task’s details will be collected.

    +
    +
      +
    1. +

      Required information: task name, task type, task deadline or duration

      +
    2. +
    3. +

      Optional information: module, task description, task weight, estimated number of hours needed

      +
    4. +
    5. +

      Input format requirement:

      + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Information TypeFormat RequirementExample

      MODULE CODE

      2 or 3 letters + 4 digits + 1 letter (optional)

      CS2101, CS2103T,
      + LSM1101

      INDEX NUMBER OF
      +MODULE

      Integer number

      1

      TASK NAME

      No more than 20 characters

      Demo presentation

      INDEX NUMBER OF
      +TASK TYPE

      Integer number

      1

      TASK DEADLINE
      +OR DURATION

      Different task types apply different date and time format

      +

      Deadline (for Assignment):
      +HH:mm dd/MM/yyyy

      +

      Duration (for other task types):
      + HH:mm dd/MM/yyyy-HH:mm dd/MM/yyyy

      +

      HH → hour, mm → minutes, dd → date, mm → month, +yyyy → year

      Assignment:
      +23:59 01/05/2020

      +

      Meeting:
      +14:0 15/04/2020-16:0 15/04/2020

      TASK DESCRIPTION

      No more than 300 characters

      this is a valid description

      TASK WEIGHT

      Positive integer or float number from 0.0 to 100.0

      12.0

      ESTIMATED NUMBER OF HOURS NEEDED

      Positive integer or float number

      10.0

      +
    6. +
    7. +

      Other constraints::

      +
      +
        +
      1. +

        The application does not allow you to enter a name that has special characters (any character that is not a letter in the alphabet).

        +
      2. +
      3. +

        The application does not allow you to assign date time that has already passed to a task. +It must be a time in the future.

        +
      4. +
      5. +

        For duration, the two dates should follow the order of start date-end date, the end date should be later than start date.

        +
      6. +
      7. +

        The total weight of tasks under the same module is capped at 100.0.

        +
        +
          +
        • +

          Both archived and not archived tasks will be taken into consideration.

          +
        • +
        • +

          This constraint also applies to tasks without module information. +Those tasks will be treated as from a same extra module. +It is designed for you to practice your time management skill :).

          +
        • +
        +
        +
      8. +
      9. +

        All index numbers entered should be positive and within a valid range. (i.e When there is only 5 modules available, the valid module index number range is 1 to 5).

        +
      10. +
      11. +

        The "Required Information" cannot be empty, on the other hand, you can press enter to skip the "Optional Information".

        +
      12. +
      +
      +
    8. +
    9. +

      Adding duplicate tasks:

      +
      +
        +
      1. +

        Look at Section 4.1.3, “Add duplicates” for more information.

        +
      2. +
      +
      +
    10. +
    +
    +
  • +
+
+
+

To add:

+
+
+
    +
  1. +

    Initiate the command using keyword add + enter.

    +
  2. +
  3. +

    Study Buddy should start with asking module information with a list of available modules as:

    +
    +
    +add module +
    +
    Figure 7. Reponse to 'add', asks for module
    +
    +
  4. +
  5. +

    You can link this task with a module by entering its MODULE CODE | INDEX NUMBER OF MODULE here , or you can press enter to skip. +Here we use "1" (CS2101) as an example.

    +
  6. +
  7. +

    After the selection of module, Study Buddy should ask for the task name. +Here we use "new task" as an example.

    +
  8. +
  9. +

    After entered the task’s name and press enter, Study Buddy should prompt for task type with the list of available types as:

    +
    +
    +add task type +
    +
    Figure 8. Asks for task’s type
    +
    +
  10. +
  11. +

    You can use the INDEX NUMBER here to choose a task type. +Here we use "1" (Assignment) as an example.

    +
  12. +
  13. +

    After the selection of task type, Study Buddy will prompt for new task’s date-time information together with the type related date-time format (i.e. different task types support different date-time formats). +Here we use "14:00 04/05/2020" as an example.

    +
  14. +
  15. +

    Next, Study Buddy should ask for the new task’s description, and we use "new task description" as an example.

    +
  16. +
  17. +

    Then, Study Buddy should ask for the new task’s weight. +Here we use "10" as an example.

    +
  18. +
  19. +

    Next, Study Buddy will prompt for the estimated number of hours needed for this new task. +Here we use "10" as an example.

    +
  20. +
  21. +

    Once you specify the estimated time needed and press enter, Study Buddy should respond with the task details collected and ask for your confirmation to add the task as:

    +
    +
    +add task info 1 +
    +
    Figure 9. Asks for user conformation to add a new task
    +
    +
    +
    +add task info 2 +
    +
    Figure 10. Task details collected
    +
    +
  22. +
  23. +

    Now, by pressing enter the new task will be added into your Study Buddy. +Meanwhile, the All Tasks Panel will update accordingly. +For this example, the panel should update as below.

    +
    +
    +add result +
    +
    Figure 11. New task added
    +
    +
  24. +
+
+
+ + + + + +
+
Tip
+
+Remember, you can use quit command to quit at any step. +
+
+
+
+

4.1.3. Add duplicates

+
+

This command accounts for you adding duplicate tasks. +When you attempt to add a duplicate, the name will be modified slightly so that you can differentiate them.

+
+
+

Example:

+
+
+

Say you have tried to add a task, you enter all the fields needed and at the end, you realise that you have already added this task.

+
+
+

Study Buddy lets you add duplicate tasks with a slight modification! +So, now you can add the task and edit it as needed.

+
+
+ + + + + +
+
Note
+
+A task is considered duplicate when the name, type, module, description, weightage, estimated time cost and deadline are the same. +
+
+
+

To add duplicates:

+
+
+
    +
  1. +

    Follow the same steps as in Section 4.1.2, “Add”, but enter a duplicate task.

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +addDuplicate +
    +
    Figure 12. Reponse to adding a duplicate
    +
    +
  4. +
  5. +

    Type in yes if you would like to continue and no if you do not.

    +
  6. +
  7. +

    If you type yes and press enter

    +
  8. +
  9. +

    The Study Buddy should respond with:

    +
    +
    +addDuplicate1 +
    +
    Figure 13. Response to adding duplicate
    +
    +
  10. +
  11. +

    As you can see in the snippet above, Study Buddy will append a number in brackets to the task name. +This number corresponds to the number of times this task name has been duplicated.

    +
    + + + + + +
    +
    Note
    +
    +If you add two duplicates of a task (eg: task(1) and task(2)), and then delete task(1), when u try to duplicate it again, it will get added as task(3). +The number will not reset to 2, because this is the third time you are attempting to duplicate. +
    +
    +
  12. +
  13. +

    If you choose to enter no at step 2, this is what you will see.

    +
    +
    +addDuplicate2 +
    +
    Figure 14. Response to choosing not to add
    +
    +
  14. +
+
+
+ + + + + +
+
Tip
+
+You can view all tasks that have been auto-edited this way, using the [View duplicates] +
+
+
+ + + + + +
+
Tip
+
+Use the Section 4.1.4, “Edit” to edit your duplicated tasks! +
+
+
+
+

4.1.4. Edit

+
+

This command is for you to edit an existing task. +To indicate the task you want to edit, you need to provide its index number.

+
+
+

Example:

+
+
+

Say when there are some typo in an existing task. +You can use this command to edit as you wish.

+
+
+
+
+

Constraints

+
+
+
    +
  1. +

    Each new value entered will be checked under the same constrain of add command. +More info you can refer from Section 4.1.2, “Add”.

    +
  2. +
  3. +

    When editing weight or module, the application will also make sure the total weight of related module’s tasks will not overflow (i.e. exceed 100).

    +
  4. +
  5. +

    You cannot edit a task to be a duplicate. i.e all the fields cannot be the same as a task that already exists.

    +
  6. +
+
+
+
+
+

To edit:

+
+
+
    +
  1. +

    Initiate the command using keyword edit + enter.

    +
  2. +
  3. +

    Study Buddy should start the task editing interaction by asking you the index number of the desired task. +Here use "1" (Homework 1) as an example.

    +
  4. +
  5. +

    When you specified the target task, Study Buddy should continue the interaction by prompting you with the list of editable information. +You can choose any of them via an index number. +Here we use "2" (Task name) as an example.

    +
    +
    +edit response index +
    +
    Figure 15. List of editable fields
    +
    +
  6. +
  7. +

    After you selected the field to edit, Study Buddy should asks you for the new value. +For this example, let’s use "Updated Task" as the new task name.

    +
  8. +
  9. +

    Once you specified the updated information and press enter, the updated record will be captured, and the All Tasks Panel will update automatically. +For this example, the panel should update as below.

    +
    +
    +edit result +
    +
    Figure 16. Task edited
    +
    +
  10. +
+
+
+
+

4.1.5. Done

+
+

This command is for you to mark a task as Finished.

+
+
+
+
+

Constraints

+
+
+
    +
  1. +

    A Finished task cannot be marked as Finished again.

    +
  2. +
+
+
+
+
+

To done:

+
+
+
    +
  1. +

    Key in done and press enter, you should get this prompt:

    +
    +
    +done index +
    +
    Figure 17. Asks for task index.
    +
    +
  2. +
  3. +

    Now key in the index of the task you wish to complete.

    +
  4. +
  5. +

    Press enter again to confirm your change.

    +
    +
    +done confirm +
    +
    Figure 18. Asks for confirmation
    +
    +
  6. +
  7. +

    Task set to Finished successfully! +Note that the task in your task list has the tag Finished.

    +
    +
    +done result +
    +
    Figure 19. Done result
    +
    +
  8. +
+
+
+ + + + + +
+
Note
+
+You can choose to archive your completed task using the archive command. +Check more details from Section 4.1.9, “Archive/ Unarchive”. +
+
+
+
+

4.1.6. Clear

+
+

This commands clears all data in the Study Buddy.

+
+
+ + + + + +
+
Caution
+
+Be careful with this command! +It will remove any data you may have entered into the Study Buddy and you cannot retrieve it. +
+
+
+

Example:

+
+
+

Say you have finished a semester and would like to clear everything in your Study Buddy and start over.

+
+
+

You can always clear everything!

+
+
+

To clear:

+
+
+
    +
  1. +

    Initiate the command using keyword clear

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +clear confirm +
    +
    Figure 20. Response to 'clear'
    +
    +
  4. +
  5. +

    Type yes and hit enter again to confirm

    +
  6. +
  7. +

    Study Buddy has been cleared completely!

    +
    +
    +clear result +
    +
    Figure 21. View empty Study Buddy
    +
    +
  8. +
  9. +

    At step 2, if you choose to type no and hit enter, this is what you will see.

    +
    +
    +clear no result +
    +
    Figure 22. Response to no
    +
    +
  10. +
+
+
+
+

4.1.7. Delete

+
+

This commands deletes a task from the existing list, using the index provided by you.

+
+
+ + + + + +
+
Caution
+
+Once a task is deleted, it cannot be retrieved. +Use this command with caution! +
+
+
+

Example:

+
+
+

After having added a task, you realise that there has been a change and you do not need to do that task anymore.

+
+
+

Study Buddy provides you an option to delete that task from the list!

+
+
+

To delete:

+
+
+
    +
  1. +

    Initiate the command using keyword delete

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +delete index +
    +
    Figure 23. Response to 'delete'
    +
    +
  4. +
  5. +

    Type the index of the task you want to delete.

    +
    +
    +delete confirm +
    +
    Figure 24. Asks for confirmation
    +
    +
  6. +
  7. +

    Press enter again to confirm

    +
  8. +
  9. +

    Task has been deleted! +You will notice that the task at the index you selected has disappeared from the list of tasks.

    +
    +
    +delete result +
    +
    Figure 25. Updated All Tasks Panel
    +
    +
  10. +
+
+
+
+

4.1.8. View renamed

+
+

This commands filtered all renamed tasks in the list i.e tasks that have a number appended to their names.

+
+
+

Example:

+
+
+

Say you want to go back and edit all the renamed tasks in your list. +Yet you do not want to scroll through the entire list to find them.

+
+
+

Study Buddy provides you an option to view all your renamed tasks in the list!

+
+
+ + + + + +
+
Caution
+
+You will still need to navigate to the main list and use that index to perform any index based operations (eg: delete, edit etc) +
+
+
+

To view renamed:

+
+
+
    +
  1. +

    Initiate the command using keyword view renamed

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +viewRenamed1 +
    +
    Figure 26. Response to 'view renamed'
    +
    +
  4. +
  5. +

    Press enter again to confirm

    +
  6. +
  7. +

    Renamed tasks have been filtered!

    +
    +
    +viewRenamed2 +
    +
    Figure 27. Updated list of renamed tasks
    +
    +
  8. +
+
+
+ + + + + +
+
Tip
+
+In order to navigate back to the main list, use Section 4.1.12, “List” +
+
+
+
+

4.1.9. Archive/ Unarchive

+
+

This commands stores the specified task into a separate list.

+
+
+

Example:

+
+
+

After a hard days work, you completed some tasks. +You don’t want them in your to-do list anymore, but you don’t want to delete them; some of the information in the task card could still be useful.

+
+
+

You can always store them in an archive!

+
+
+

To archive:

+
+
+
    +
  1. +

    Initiate the command using keyword archive

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +archive index +
    +
    Figure 28. Response to 'archive'
    +
    +
  4. +
  5. +

    Type the index of the task you want to archive, here use "1" (Leadership Presentation) as an example.

    +
  6. +
  7. +

    Study Buddy will ask for your confirmation before archive the target task.

    +
    +
    +archive confirm +
    +
    Figure 29. Asks for confirmation
    +
    +
  8. +
  9. +

    Press enter again to confirm, the task will be archived and the user interface will update.

    +
    +
    +archive result +
    +
    Figure 30. Task is archived successfully
    +
    +
  10. +
  11. +

    You can view the archived task under the StudyBuddyArchived Tasks tab.

    +
    +
    +check archive +
    +
    Figure 31. Navigates to archived tasks
    +
    +
    +
    +archive list +
    +
    Figure 32. Archived tasks
    +
    +
  12. +
+
+
+
+
+
    +
  • +

    To unarchive a task, and add it back to the main list, simply follow the same set of commands, but replace the archive keyword with unarchive

    +
  • +
  • +

    Remember to use the index in the Archived Task instead of All Tasks

    +
  • +
+
+
+
+
+ + + + + +
+
Note
+
+If you attempt to unarchive a task that already exists in the main list, the name will automatically be appended with a number in order to avoid duplication. +This is done in the same way as Section 4.1.3, “Add duplicates” +
+
+
+
+

4.1.10. Sort

+
+

This command is for you to reorder the task list in All Tasks Panel.

+
+
+
+
+
+
Currently you can sort tasks by their
+
+
+
    +
  • +

    Deadline / Task Start Date

    +
  • +
  • +

    Task Name

    +
  • +
  • +

    Creation Date & Time

    +
  • +
+
+
+
+
+
+
+
+

Example

+
+
+

When you want to sort all your unarchived tasks by their deadline or start date, you may utilize this command to achieve the desired order.

+
+
+

To sort:

+
+
+
    +
  1. +

    Initiate the command using keyword sort + enter.

    +
  2. +
  3. +

    Study Buddy should provide the list of sorting options as below, and you can use the index number to select the desired sort. +Here we use 1 (Deadline / Task Start Date) as an example.

    +
    +
    +sort term +
    +
    Figure 33. Sorting options and the order of the tasks before sort
    +
    +
  4. +
  5. +

    After the selection, Study Buddy should ask for your confirmation to perform the reorder. +You can press enter again to confirm. +Meanwhile, the tasks in All Tasks Panel will be sorted accordingly.

    +
    +
    +sort result +
    +
    Figure 34. The order of the tasks after sort
    +
    +
  6. +
+
+
+ + + + + +
+
Tip
+
+The tasks in All Tasks Panel will not change back to the original order by itself.
+You can use sortCreation Date & Time to do so. +
+
+
+
+

4.1.11. Find

+
+

Finds tasks whose names contain any of the given keywords.

+
+
+

To find a task:

+
+
+
    +
  1. +

    Initiate the command with find.

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +find keyword +
    +
    Figure 35. Response to 'find'
    +
    +
  4. +
  5. +

    Enter the keyword that you want to search for, e.g. quiz, and press enter to confirm sorting.

    +
  6. +
  7. +

    You have found a list of tasks that contain your keyword!

    +
    +
    +find result +
    +
    Figure 36. Find result
    +
    +
  8. +
+
+
+
+
+
    +
  • +

    The search is case insensitive. e.g homework will match Homework

    +
  • +
  • +

    The order of the keywords does not matter. e.g. CS Homework will match Homework CS

    +
  • +
  • +

    Only the name is searched.

    +
  • +
  • +

    Substrings will be matched e.g. work will match Homework

    +
  • +
  • +

    Tasks matching at least one keyword will be returned (i.e. OR search). e.g. CS Homework can return CS Quiz, +Reflection Homework.

    +
  • +
+
+
+
+
+ + + + + +
+
Important
+
+To navigate back to the always on display list of tasks, you can use the Section 4.1.12, “List” function. +
+
+
+
+

4.1.12. List

+
+

Oh no! +How do I get the original list back after using find? +Calm down and use the list command! +The list command lists all the tasks that have been created in StudyBuddy.

+
+
+

To use the list command:

+
+
+
    +
  1. +

    Initiate the command with list.

    +
  2. +
  3. +

    Done! +All your tasks are listed once again!

    +
    +
    +list result +
    +
    Figure 37. List result
    +
    +
  4. +
+
+
+
+

4.1.13. Filter

+
+

This commands helps you filter your tasks by category. +The two categories available are status and type.

+
+
+ + + + + +
+
Note
+
+Note that Due Soon tasks are already filtered for you. +Refer to Section 4.3, “Due Soon Tasks” +
+
+
+ + + + + +
+
Tip
+
+To navigate back to your main list, check out Section 4.1.12, “List” +
+
+
+

Example:

+
+
+

Say you want to view a list of all your pending tasks.

+
+
+

Study Buddy provides an option to filter your list!

+
+
+

To filter:

+
+
+
    +
  1. +

    Initiate the command using keyword filter

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +filter term +
    +
    Figure 38. Response to 'filter'
    +
    +
  4. +
  5. +

    Enter your choice. +If you enter 1, you have chosen to filter by status.

    +
    +
    +filter status +
    +
    Figure 39. Response to filter by 'status'
    +
    +
  6. +
  7. +

    You can then proceed to choose what status type you would like to filter by. +Here we have filtered by "Pending" as an example.

    +
    +
    +filter status result +
    +
    Figure 40. Response to filter by status tag 'Pending'
    +
    +
  8. +
  9. +

    At point 3 above, if you enter 2 instead, you have chosen to filter by task types.

    +
    +
    +filter type +
    +
    Figure 41. Response to filter by task 'type'
    +
    +
  10. +
  11. +

    Once again, imagine your study buddy currently looks like Figure 30 above. (at point 4)

    +
  12. +
  13. +

    You can then proceed to choose what task type you would like to filter by. +Here we have filtered by "assignment" as an example.

    +
    +
    +filter type result +
    +
    Figure 42. Response to filter by task type 'assignment'
    +
    +
  14. +
+
+
+
+

4.1.14. Refresh

+
+

This commands refreshes the list of tasks Due Soon as well as status tags.

+
+
+ + + + + +
+
Important
+
+Due soon list shows tasks due within the next week. +Details are in Section 4.3, “Due Soon Tasks” +
+
+
+ + + + + +
+
Note
+
+Status tags include information on the tasks' status, eg: pending, overdue etc. +
+
+
+

Example:

+
+
+

Say you left Study Buddy open for a few days. +When you come back, you notice that the time left for the deadline on the Due Soon tasks is not accurate.

+
+
+

You can refresh them!

+
+
+ + + + + +
+
Tip
+
+Anytime you notice an inconsistency in time left/status, use this command! +
+
+
+

To refresh:

+
+
+
    +
  1. +

    Say this is what Study Buddy looks like.

    +
    +
    +refresh before +
    +
    Figure 43. Current state (needs to be refreshed)
    +
    +
    +

    Suppose you notice that the task "Homework 1" is still in pending status.

    +
    +
  2. +
  3. +

    Initiate the refresh command using keyword refresh and press enter to confirm the action.

    +
  4. +
  5. +

    Tasks have been refreshed!

    +
    +
    +refresh result +
    +
    Figure 44. Refreshed Study Buddy
    +
    +
    +

    You will notice that the overdue task has now moved out of the due soon list and has the updated status tag "overdue".

    +
    +
  6. +
+
+
+ + + + + +
+
Note
+
+After 'refresh', the tasks in All Tasks Panel will be sorted by their deadline or start date. +
+
+
+
+

4.1.15. Exit

+
+

This command exits from Study Buddy.

+
+
+ + + + + +
+
Note
+
+All your data will be saved and reloaded when you open the application later! +You can find details about this in Section 4.2, “Saving Data” +
+
+
+

Example:

+
+
+

After working all day, you would like to close the application and have a good night’s sleep.

+
+
+

You can always exit the application!

+
+
+

To exit:

+
+
+
    +
  1. +

    Initiate the command using keyword bye

    +
  2. +
  3. +

    Study Buddy should respond with:

    +
    +
    +exit confirm +
    +
    Figure 45. Response to 'bye'
    +
    +
  4. +
  5. +

    Type 'yes' and press enter to exit, the Study Buddy window will close automatically.

    +
  6. +
  7. +

    If instead, you type 'yes' and press enter, this is what you will see,

    +
    +
    +exit no +
    +
    Figure 46. Response to 'no'
    +
    +
  8. +
+
+
+ + + + + +
+
Note
+
+You can still use quit to go back. +
+
+
+
+
+

4.2. Saving Data

+
+

Study Buddy data is automatically saved in the hard disk after any command that changes the data.

+
+
+

There is no need to save manually.

+
+
+

When the application is closed and re-opened, you should be able to see all the data you have added previously!

+
+
+
+

4.3. Due Soon Tasks

+
+

The Due Soon task list is always on display in your application under Study BuddyAll tasks

+
+
+

It provides the following functionality:

+
+
+
    +
  1. +

    It displays your tasks that are due within the next week. (uses deadline you have provided)

    +
    +
    +due soon +
    +
    Figure 47. Due Soon List
    +
    +
  2. +
  3. +

    It automatically sorts these tasks in an ascending order of deadlines.

    +
    +
    +due soon sort +
    +
    Figure 48. Due Soon List
    +
    +
  4. +
  5. +

    It automatically adds applicable tasks when you make changes to your main list, such as add (Section 4.1.2, “Add”) or delete (Section 4.1.7, “Delete”).

    +
  6. +
  7. +

    It displays a tag with the time left to the deadline.

    +
    +
    +due soon tag +
    +
    Figure 49. Due Soon List
    +
    +
  8. +
  9. +

    It provides a Section 4.1.14, “Refresh” function that allows you to refresh time/state of this list if needed.

    +
  10. +
+
+
+ + + + + +
+
Note
+
+Time left is never displayed in days and minutes. +Hence if the current time is 9:00 am on 01/04/2020 and the task deadline is 9:02 am on 02/04/2020, it will show time left as 1 day. (not 1 day and 2 minutes) +
+
+
+ + + + + +
+
Note
+
+Due soon list will never display finished tasks. eg: if you unarchive a completed task, it will not appear in the Due Soon list. +
+
+
+
+

4.4. Modules

+
+

The modules page organises your tasks into various modules. +By default (i.e, when there is no module created), the modules page shows the following:

+
+
+
    +
  1. +

    Overview. +This tab shows all the modules you created.

    +
  2. +
  3. +

    No Module Allocated. +This tab shows the list of tasks that has not yet been allocated to any module. +By default, all tasks will show up here if you have not allocated any tasks to the modules.

    +
    +
    +module show +
    +
    Figure 50. modules page
    +
    +
  4. +
+
+
+

4.4.1. Navigation

+
+
+
Navigate to modules page
+
+
+
    +
  1. +

    To navigate to the modules page, click on ModulesShow Modules in the menu bar or press F1 in your keyboard.

    +
    +
    +modules show module +
    +
    Figure 51. Modules dropdown menu
    +
    +
  2. +
+
+
+
Navigation in modules page
+
+
+
    +
  1. +

    The clicking on the leftmost tab shows the Overview of all your modules. it displays the module’s name and their code.

    +
    +
    +module tab 1 +
    +
    Figure 52. Module tab Overview
    +
    +
  2. +
  3. +

    The rightmost tab shows the list of task that has not been allocated to any modules.

    +
    +
    +module tab 3 +
    +
    Figure 53. Module tab No Module Allocated
    +
    +
  4. +
  5. +

    The tabs in the middle are modules that you have added to the modules page.

    +
    +
    +module tab 2 +
    +
    Figure 54. Module tab available modules
    +
    +
  6. +
+
+
+
+
+
+
+

4.4.2. Functions

+
+
Create Modules
+
+ + + + + +
+
Tip
+
+Study Buddy provides tow approaches for user to execute create module and edit module actions. +
+
+
+

To start the interaction of creating a module, click on ModulesCreate in the menu bar.
+Alternatively, you can key in create mods into the input line.

+
+
+
+module nav create +
+
Figure 55. Entry of module creation
+
+
+
+
+

Constraints

+
+
+
    +
  1. +

    Module Name
    +The name of this module cannot be the same as any existing modules.

    +
  2. +
  3. +

    Module Code Format

    +
    +
      +
    1. +

      The module code also need to be unique.

      +
    2. +
    3. +

      The module code should have a 2-3 letter prefix, a 4-digit number, followed by a single postfix.

      +
      +
        +
      • +

        Correct Module Code Examples
        +LSM1303
        +CS2040C
        +IS1103
        +MA1521

        +
      • +
      • +

        Incorrect Module Code Examples
        +CSSS1234 - Prefix is too long
        +C0001 - Prefix is too short
        +ZZ12345 - number is more than 4 digits
        +A1111XX - Postfix is too long

        +
      • +
      +
      +
    4. +
    +
    +
  4. +
+
+
+
+
+

To Create Module:

+
+
+
    +
  1. +

    Click on ModuleCreate or key in create mods. +A prompt will show up at the bottom of the screen.

    +
    +
    +module create name +
    +
    Figure 56. Asks for module name
    +
    +
  2. +
  3. +

    Key in the name of your module.Here we use "New Module" as an example. +Then Study Buddy will ask for the module code.

    +
    +
    +module create code +
    +
    Figure 57. Asks for module code
    +
    +
  4. +
  5. +

    Here we use "CSS1234" as an example.

    +
    +
    +module create confirm +
    +
    Figure 58. Asks for confirmation
    +
    +
  6. +
  7. +

    Press enter to confirm, and the module page will update accordingly.

    +
    +
    +module create result +
    +
    Figure 59. New Module with code CSS1234 created.
    +
    +
  8. +
+
+
+

Congratulations, you have added a module to your modules page!

+
+
+
+
+

4.4.3. Edit Modules

+
+

To start the interaction of editing a module, click on ModulesEdit in the menu bar.
+Alternatively, you can key in edit mods into the input line.

+
+
+
+module nav edit +
+
Figure 60. Entry of module editing
+
+
+

Study Buddy provides three module editing options.

+
+
+
+
Edit options
+
+
+
    +
  • +

    Change Module name.

    +
  • +
  • +

    Change Module code.

    +
  • +
  • +

    Delete Module.

    +
  • +
+
+
+
+
+
+
+
+

Constraints:

+
+
+
    +
  1. +

    When choosing the module to edit, you need to provide a valid and existed module code.

    +
  2. +
  3. +

    When entering the value of new module name or new module code, you need to provide a different valid value.

    +
  4. +
  5. +

    The above "valid" judgment follows the same constraints as Section 4.4.2.1, “Create Modules”.

    +
  6. +
+
+
+
+
+

To Edit Module:

+
+
+
    +
  1. +

    Click on ModuleEdit key in edit mods. +A prompt will show up to ask the module code of target module.

    +
    +
    +module edit code +
    +
    Figure 61. Asks for module mode
    +
    +
  2. +
  3. +

    Key in the code of the module that you want to edit. +Here we use "CSS1234" as an example. +Then Study Buddy will ask for the edit option.

    +
    +
    +module edit option +
    +
    Figure 62. Asks for edit option
    +
    +
  4. +
  5. +

    Key in the index of your option.

    +
    +
      +
    1. +

      "1" → Change Module Name

      +
      +

      Key in your new module name and press enter to confirm the editing. +Here we use "Edited Module Name" as an example.
      +The module page will update accordingly.

      +
      +
      +
      +module edit name result +
      +
      Figure 63. Module name editing result
      +
      +
    2. +
    3. +

      "2" → Change Module Code

      +
      +

      Key in your new module code and press enter to confirm the editing. +Here we use "LY3000" as an example.
      +The module page will update accordingly.

      +
      +
      +
      +module edit code result +
      +
      Figure 64. Module code editing result
      +
      +
      +

      Module code changed!

      +
      +
    4. +
    5. +

      "3" → Delete Module

      +
      + + + + + +
      +
      Caution
      +
      +After successfully deleting a module, the related tasks will also be affected. +
      +
      +
      +

      To delete the chosen module, you only need to press enter to confirmed the deletion. +To better showcase the behaviour of deletion, here we use "CS2103T" as an example.

      +
      +
      +
        +
      1. +

        Before delete:

        +
        +
        +module delete before +
        +
        Figure 65. Before delete
        +
        +
      2. +
      3. +

        After delete:
        +After successfully deleted target module, the module page will update accordingly and switch to +Overview page.

        +
        +

        If you switch to No Module Allocated tab, you’ll find the tasks affected by this deletion (i.e. The tasks which belong to the deleted module).

        +
        +
        +
        +module delete after +
        +
        Figure 66. Checking the affected tasks
        +
        +
      4. +
      +
      +
    6. +
    +
    +
  6. +
+
+
+
+
+

4.5. Statistics

+
+

With all the tasks and modules' information you entered, Study Buddy can provide you with a real-time visualized statistics about:

+
+
+
    +
  • +

    Task status

    +
  • +
  • +

    Module related tasks' deadline/ start date

    +
  • +
  • +

    Module related tasks' weight

    +
  • +
+
+
+

It utilizes different types of charts to make the information more intuitive. +In addition, the chart is always updated in sync with your task records. +Especially when you execute commands such as +add edit delete sort find archive done list and clear.

+
+
+ + + + + +
+
Tip
+
+The colour theme will also change randomly, hope you enjoy :) +
+
+
+ + + + + +
+
Note
+
+The statistics feature is built on top of the data collected from the basic functionality described in Section 4.1, “Basic features”. +Which means Study Buddy only supports keyboard input for statistics generating.
+Therefore, even though this feature involves mouse-clicking, it is still designed for a fast typist. +
+
+
+

4.5.1. Navigate to Statistics Page

+
+

You can navigate to Statistics page by clicking the Statistics from the menu bar.

+
+
+
+stats nav +
+
Figure 67. Entry of Statistics page
+
+
+
+

4.5.2. Statistics Page User Interface and Interaction

+
+

The left panel contains different charts for different statistics. +You can use the tabs circled in light orange to navigate.

+
+
+

When you click on a statistics chart, the associated task records will be listed automatically in the right-side panel.

+
+
+
+stats ui +
+
Figure 68. Statistics Page User Interface
+
+
+
Task Status Tab
+
+
+
Introduction
+
+

This clickable pie chart compares the number of tasks in different statuses.

+
+
+stats pie +
+
Figure 69. Task Status Chart
+
+
+
Clicking Action
+
+

When you click on the chart, all the tasks with the selected status will display on the right-side panel automatically.

+
+

Here is an example when you are clicking on the Due Soon portion.

+
+
+
    +
  • +

    The part highlighted by light purple lines represents all your Due Soon tasks. +When you are clicking on it, all tasks with Due Soon status will be listed in the right-side panel.

    +
    +

    You can refer to the screenshot below where the relevant information is highlighted for you.

    +
    +
    +
    +stats pie click +
    +
    Figure 70. Clicking on 'Due Soon' part
    +
    +
  • +
+
+
+
+
+
+
+ +
+
+
Introduction
+
+

This clickable area chart summarizes the task deadlines or start dates for different modules.

+
+
+stats area +
+
Figure 71. Module Related Tasks' Deadline/Start Date Chart
+
+
+
+
+
+
Chart Details
+
+
+
    +
  1. +

    The X-axis represents a particular date.

    +
  2. +
  3. +

    The Y-axis represents the number of tasks.

    +
  4. +
  5. +

    The area (i.e. The triangles or quadrilaterals exclude their vertices) with the same background colour represents the tasks under the same module.

    +
  6. +
  7. +

    The data point (i.e. The vertices of the triangles or quadrilaterals) represents tasks under a particular module, which will due or start on the same specific data.

    +
  8. +
  9. +

    Tasks under different module have a different background colour.

    +
  10. +
  11. +

    Only the tasks due or start within the next 60 days will display in both chart or right-side panel.

    +
  12. +
  13. +

    Since the colour of each module is translucent, "extra" colours may appear as a result of data overlapping.

    +
  14. +
  15. +

    When clicking on an overlapping area, only one layer’s related records will be listed in the right-side panel.

    +
  16. +
+
+
+
+
+
+
+
+
Clicking Action
+
+

After you click on the chart, the related task records will display on the right-side panel automatically.

+
+

Here are two different behaviours according to the place you click.

+
+
+
    +
  1. +

    Click on data area:

    +
    +

    The tasks under a particular module will be listed in the right-side panel.

    +
    +
    +

    Here is an example when you are clicking on the area of module "CS2101".

    +
    +
    +
      +
    • +

      The parts highlighted using light purple lines represents the tasks under module "CS2101". +When you are clicking on those areas, the tasks under CS2101 and will due or start within the next 60 days will display in the right-side panel.

      +
      +

      You can refer to the screenshot below where the relevant information is highlighted for you.

      +
      +
      +
      +stats area click area +
      +
      Figure 72. Clicking on the area of module 'CS2101'
      +
      +
    • +
    +
    +
  2. +
  3. +

    Click on data point:

    +
    +

    The tasks under a particular module and will due or start on a specific date will be listed in the right-side panel.

    +
    +
    +

    Here is an example when you are clicking on the data point of tasks under module "CS2101" and will due or start on 13/04/2020.

    +
    +
    +
      +
    • +

      The point circled in light purple is the data point you clicked. +After you clicked on this point, the tasks under module "CS2101" and will due or start on 13/04/2020 will display in the right-side panel.

      +
      +

      You can refer to the screenshot below where the relevant information is highlighted for you.

      +
      +
      +
      +stats click point +
      +
      Figure 73. Clicking on the data point of module 'CS2101’s tasks which will due or start on 13/04/2020
      +
      +
    • +
    +
    +
  4. +
+
+
+
+
+
+
+ +
+
+
Introduction
+
+

This clickable stacked bar chart compares the weight of different types of tasks in each module.

+
+
+stats bar +
+
Figure 74. Module Related Tasks' Weight Chart
+
+
+
+
+
+
Chart Details
+
+
+
    +
  1. +

    The X-axis represents different modules.

    +
  2. +
  3. +

    The Y-axis represents the weight-sum under the same module.

    +
  4. +
  5. +

    The blocks in each bar represent the total weight of a particular task type.

    +
  6. +
  7. +

    Different task type has a different background colour.

    +
  8. +
+
+
+
+
+
+
+
+
Clicking Action
+
+

After you click on the chart, the tasks under the selected module and type will display on the right-side panel automatically.

+
+

Here is an example when you are clicking on the block which represents the assignments of module "CS2101".

+
+
+
    +
  • +

    The block highlighted using light purple lines represents the assignments of module "CS2101". +When you are clicking it, all assignments of module "CS2101" will show in the right-side panel.

    +
    +

    You can refer to the screenshot below where the relevant information is highlighted for you.

    +
    +
    +
    +stats bar click +
    +
    Figure 75. Clicking on the block of 'CS2101''s assignments
    +
    +
  • +
+
+
+
+
+
+ + + + + +
+
Note
+
+As the data of charts are filled dynamically, thus it is possible that their labels can overlap together.
+This is an unfixed bug regarding the JDK which is caused by JavaFX chart off-sync. +To get more information, you may refer to here.
+When this issue happens, you can use any command that can trigger chart updating to refresh the chart. +
+
+
+
+
+
+

4.6. Calendar

+
+
+
+

Constraints

+
+
+
    +
  1. +

    The calendar GUI does not work well if the window size is set too small.

    +
  2. +
  3. +

    You will not be able to navigate too far into the past/ future using CLI.

    +
  4. +
+
+
+
+
+

The calendar feature allows you to visualise your schedule by displaying the number of task you have for the month. +This allows students to plan their time efficiently.

+
+
+

The calendar feature can be toggled by clicking Calendar from the menu bar.

+
+
+
+calendar init +
+
Figure 76. calendar interface
+
+
+
    +
  • +

    Previous and Next buttons can be used to navigate through previous and next months respectively. Current month button brings you to the current date, which is in a blue border.

    +
  • +
  • +

    Clicking on any date will show you all tasks for that day. +Keep in mind that the Index shown in this panel cannot be used for other commands.

    +
  • +
+
+
+
+calendar click +
+
Figure 77. calendar after clicking on a date
+
+
+

4.6.1. Navigation using CLI

+
+

Study buddy also allows you to navigate to any date in the Calendar.

+
+
+
    +
  1. +

    To initiate fast navigation, simply key in calendar into the input line.

    +
  2. +
  3. +

    Study buddy will ask you for a date

    +
    +
    +Calendar CLI Date +
    +
    Figure 78. Interactive prompt after keying in calendar
    +
    +
    +

    In this example, we entered 20/04/2020.

    +
    +
  4. +
  5. +

    Input your date using the format shown and press enter once to proceed.

    +
  6. +
  7. +

    Press enter again to confirm your command.

    +
  8. +
+
+
+

You will now see the calendar for your selected date as well as all the tasks on that day.

+
+
+
+calendar after CLI +
+
Figure 79. Successfully navigated calendar using CLI
+
+
+
+
+

4.7. Productivity

+
+

The productivity page shows insights related to your productivity over the past day, week and more. +By keeping tabs on your past productivity, you can improve your future productivity. +The productivity feature also gamifies your task management experience. +Doing work has never been more fun!

+
+
+
1. Daily Productivity Tab
+

To get started, click on the Productivity menu button. +The daily productivity tab records your the number of tasks you completed today. +You can set a daily goal for the number of tasks you want to complete using the command goal. +Completing your goal each day adds to your streak.

+
+
+
2. Weekly Productivity Tab
+

On the weekly productivity tab, you can look back on your progress over the past week. +This tab displays information about your past productivity.

+
+
+
3. Productivity Points Tab
+

You can go to this tab directly by clicking your Productivity Point count on the top right of the menu. +The Productivity Points tab displays your current Productivity Points (PP) and your progression. +You gain Productivity Points upon adding tasks, completing tasks, and using advanced features in StudyBuddy. +On the other hand, you lose Productivity Points when your tasks go Overdue. +Here are some examples of how to obtain Productivity Points in StudyBuddy:

+
+
+
    +
  1. +

    Adding a task: +1

    +
  2. +
  3. +

    Completing a task: +10

    +
  4. +
  5. +

    Using advanced features; +? (Explore StudyBuddy to find out!)

    +
  6. +
  7. +

    Letting a task go Overdue: -1

    +
  8. +
+
+
+
+
+ +
+

6. FAQ

+
+
+

Q: How do I transfer my data to another Computer?
+A: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous Study Buddy folder (should be under data → taskList.json).

+
+
+

Q: How do I save my data?
+A: Study buddy saves your data automatically after every command.

+
+
+
+
+ + + diff --git a/docs/UserGuide.pdf b/docs/UserGuide.pdf new file mode 100644 index 00000000000..49c2e16afa6 Binary files /dev/null and b/docs/UserGuide.pdf differ diff --git a/docs/UsingAppVeyor.adoc b/docs/UsingAppVeyor.adoc index 12a7a89ac68..f568574f18c 100644 --- a/docs/UsingAppVeyor.adoc +++ b/docs/UsingAppVeyor.adoc @@ -6,15 +6,11 @@ ifdef::env-github[] :note-caption: :information_source: endif::[] -[NOTE] -==== -This document was originally written for _AddressBook Level 4_ and hence its screenshots refer to `addressbook-level4`. -For use with _AddressBook Level 3_, wherever `addressbook-level4` is used in the screenshots, you should use *`addressbook-level3`*. -==== +https://www.appveyor.com/[AppVeyor] is a _Continuous Integration_ platform for GitHub projects. +It runs its builds on Windows virtual machines. -https://www.appveyor.com/[AppVeyor] is a _Continuous Integration_ platform for GitHub projects. It runs its builds on Windows virtual machines. - -AppVeyor can run the project's tests automatically whenever new code is pushed to the repo. This ensures that existing functionality and features have not been broken on Windows by the changes. +AppVeyor can run the project's tests automatically whenever new code is pushed to the repo. +This ensures that existing functionality and features have not been broken on Windows by the changes. The current AppVeyor setup runs `gradlew.bat test` whenever someone pushes code to the repo. @@ -22,24 +18,27 @@ If you would like to customize your AppVeyor build further, you can learn more a == Setting up AppVeyor -. Fork the repo to your own organization. -. Go to https://ci.appveyor.com/, and under `Login`, click on `GitHub` to login with your GitHub account. Enter your GitHub account details if needed. +. Fork the repo to your own organization. +. Go to https://ci.appveyor.com/, and under `Login`, click on `GitHub` to login with your GitHub account. +Enter your GitHub account details if needed. + image:appveyor/login.png[Click on GitHub in the login page] + -. After logging in, you will be brought to your projects dashboard. Click on `NEW PROJECT`. +. After logging in, you will be brought to your projects dashboard. +Click on `NEW PROJECT`. + image:appveyor/add-project-1.png[Click on "NEW PROJECT" in the projects dashboard] + -. You will be brought to the `Select repository` page. Select `GitHub`. -* On your first usage of AppVeyor, you will need to give AppVeyor authorization to your GitHub account. Click on `Authorize GitHub`. +. You will be brought to the `Select repository` page. +Select `GitHub`. +* On your first usage of AppVeyor, you will need to give AppVeyor authorization to your GitHub account. +Click on `Authorize GitHub`. + image:appveyor/add-project-2.png[Click on Authorize GitHub] + * This will bring you to a GitHub page that manages the access of third-party applications to your repositories. + -Depending on whether you are the owner of the repository, you can either -grant access: +Depending on whether you are the owner of the repository, you can either grant access: + image:grant_access.png[Grant Access] + @@ -47,20 +46,23 @@ Or request access: + image:request_access.png[Request Access] + -. AppVeyor will then list the repositories you have access to in your GitHub account. Find the repository you want to set AppVeyor up on, and then click `ADD`. +. AppVeyor will then list the repositories you have access to in your GitHub account. +Find the repository you want to set AppVeyor up on, and then click `ADD`. + image:appveyor/add-project-3.png[Click "Add" on the repository you want to set AppVeyor up on] + -. AppVeyor will then be activated on that repository. To see the CI in action, push a commit to any branch! -* Go to the repository and see the pushed commit. There should be an icon which will link you to the AppVeyor build: +. AppVeyor will then be activated on that repository. +To see the CI in action, push a commit to any branch! +* Go to the repository and see the pushed commit. +There should be an icon which will link you to the AppVeyor build: + -image:appveyor/ci-pending.png[Commit build] +image:appveyor/ci-Pending.png[Commit build] + * As the build is run on a remote machine, we can only examine the logs it produces: + image:appveyor/ci-log.png[AppVeyor build] + -. Update the link to the "build status" badge at the top of `README.adoc` to point to the AppVeyor build status of your own repo. +. Update the link to the "build status" badge at the top of `README.adoc` to point to the AppVeyor build status of your own repo. * To find your build status badge URL, first go to your project settings by clicking on the "Settings" icon: + image:appveyor/project-settings-1.png[Click on project settings] @@ -69,7 +71,8 @@ image:appveyor/project-settings-1.png[Click on project settings] + image:appveyor/project-settings-2.png[Click on "Badges"] + -* As AppVeyor does not provide asciidoc code for the badge, we will have to create our own. Start by copying the markdown code provided: +* As AppVeyor does not provide asciidoc code for the badge, we will have to create our own. +Start by copying the markdown code provided: + image:appveyor/project-settings-3.png[Copy the markdown code] + diff --git a/docs/UsingCheckstyle.adoc b/docs/UsingCheckstyle.adoc index a12ab09cc9c..0f3a90bb0d6 100644 --- a/docs/UsingCheckstyle.adoc +++ b/docs/UsingCheckstyle.adoc @@ -8,11 +8,6 @@ ifdef::env-github[] :note-caption: :information_source: endif::[] -[NOTE] -==== -This document was originally written for _AddressBook Level 4_ and hence its screenshots refer to `addressbook-level4`. -For use with _AddressBook Level 3_, wherever `addressbook-level4` is used in the screenshots, you should use *`addressbook-level3`*. -==== == Configuring Checkstyle-IDEA @@ -21,12 +16,13 @@ Select `Plugins`, press `Browse Repository`, and find the plugin. + Restart the IDE to complete the installation. . Click `File` > `Settings...` > `Other Settings` > `Checkstyle` . Set `Scan Scope` to `Only Java sources (including tests)`, so that the plugin will run checkstyle for our test source codes as well -. Ensure that the `Checkstyle version` is set to `8.1`. This is the same version that we are using inside Gradle, so that you won't get any errors due to version incompatibility - * If `Checkstyle version` is not set to `8.1`, set it to version `8.1` and click `Apply` +. Ensure that the `Checkstyle version` is set to `8.1`. +This is the same version that we are using inside Gradle, so that you won't get any errors due to version incompatibility +* If `Checkstyle version` is not set to `8.1`, set it to version `8.1` and click `Apply` + image::checkstyle-idea-scan-scope.png[width="500"] . Click the plus sign under `Configuration File` -. Enter an arbitrary description e.g. addressbook +. Enter an arbitrary description e.g. studybuddy . Select `Use a local Checkstyle file` . Use the checkstyle configuration file found at `config/checkstyle/checkstyle.xml` . Click `Next` > `Finish` diff --git a/docs/UsingCoveralls.adoc b/docs/UsingCoveralls.adoc index 5191e47316c..6abfb5fc72a 100644 --- a/docs/UsingCoveralls.adoc +++ b/docs/UsingCoveralls.adoc @@ -6,28 +6,27 @@ ifdef::env-github[] :note-caption: :information_source: endif::[] -[NOTE] -==== -This document was originally written for _AddressBook Level 4_ and hence its screenshots refer to `addressbook-level4`. -For use with _AddressBook Level 3_, wherever `addressbook-level4` is used in the screenshots, you should use *`addressbook-level3`*. -==== https://coveralls.io/[Coveralls] is a web service that tracks code coverage over time for GitHub projects. Coveralls requires Travis CI to be set up beforehand as Travis sends the coverage report from the latest build to Coveralls. -If you have not set up Travis CI, see <>. Currently, Coveralls supports Travis CI but not AppVeyor. +If you have not set up Travis CI, see <>. +Currently, Coveralls supports Travis CI but not AppVeyor. == Setting up Coveralls -. Go to https://coveralls.io/ and click `SIGN IN`. Then click `GITHUB SIGN IN` and enter your GitHub account details if needed. +. Go to https://coveralls.io/ and click `SIGN IN`. +Then click `GITHUB SIGN IN` and enter your GitHub account details if needed. + -. After logging in, you will be brought to the `Your Repositories` page. On the site's navigation bar, click https://coveralls.io/repos/new[ADD REPOS]. +. After logging in, you will be brought to the `Your Repositories` page. +On the site's navigation bar, click https://coveralls.io/repos/new[ADD REPOS]. + -. Find the switch for the forked repository. +. Find the switch for the forked repository. * If the organization is not shown, click `GITHUB SETTINGS` as shown below: + image:coveralls/github_settings.png[GitHub settings] + -This should bring you to a GitHub page that manages the access of third-party applications. Depending on whether you are the owner of the repository, you can either grant access +This should bring you to a GitHub page that manages the access of third-party applications. +Depending on whether you are the owner of the repository, you can either grant access + image:grant_access.png[Grant Access] + @@ -40,24 +39,26 @@ to Coveralls so that it can access your repository. + image:coveralls/sync_repos.png[Sync repos] + -. Activate the switch. +. Activate the switch. + image:coveralls/flick_repository_switch.png[Activate the switch] + -. Update the link of the `Coverage Status` badge at the top of your <> to point to that of your own repo by replacing the outlined areas with `your-org-name/your-repo-name`. +. Update the link of the `Coverage Status` badge at the top of your <> to point to that of your own repo by replacing the outlined areas with `your-org-name/your-repo-name`. + image:coveralls/coverage_asciidoc_code.png[Coverage Status Badge] + -. You can now see the coverage report for your project after each Travis build by clicking on the `Coverage Status` badge. +. You can now see the coverage report for your project after each Travis build by clicking on the `Coverage Status` badge. + image:coveralls/coverage_report.png[Coverage Report Summary] == Disabling Coveralls Automatic Comments on Pull Requests -Coveralls automatically comments on the coverage status of the pull requests in GitHub. If it's a hindrance, you can disable it in the settings of your project in Coveralls: +Coveralls automatically comments on the coverage status of the pull requests in GitHub. +If it's a hindrance, you can disable it in the settings of your project in Coveralls: -. Click `Settings`. +. Click `Settings`. + -. Uncheck the `LEAVE COMMENTS?` checkbox. Then click `SAVE CHANGES`. +. Uncheck the `LEAVE COMMENTS?` checkbox. +Then click `SAVE CHANGES`. + -image:coveralls/disable_comments.png[Disable comments, width = 942] +image:coveralls/disable_comments.png[Disable comments,width = 942] diff --git a/docs/UsingGradle.adoc b/docs/UsingGradle.adoc index cca9c6d1d12..c4fa45920fd 100644 --- a/docs/UsingGradle.adoc +++ b/docs/UsingGradle.adoc @@ -8,7 +8,8 @@ ifdef::env-github[] :note-caption: :information_source: endif::[] -https://gradle.org/[Gradle] is a build automation tool. It can automate build-related tasks such as +https://gradle.org/[Gradle] is a build automation tool. +It can automate build-related tasks such as * Running tests * Managing library dependencies @@ -21,7 +22,8 @@ To learn more about gradle build scripts, refer https://docs.gradle.org/current/ == Running Gradle Commands -To run a Gradle command, open a command window on the project folder and enter the Gradle command. Gradle commands look like this: +To run a Gradle command, open a command window on the project folder and enter the Gradle command. +Gradle commands look like this: * On Windows: `gradlew ...` e.g. `gradlew clean test` * On Mac/Linux: `./gradlew ...` e.g. @@ -37,12 +39,16 @@ Deletes the files created during the previous build tasks (e.g. files in the `bu [TIP] *`clean` to force Gradle to execute a task*: + -When running a Gradle task, Gradle will try to figure out if the task needs running at all. If Gradle determines that the output of the task will be same as the previous time, it will not run the task. For example, it will not build the JAR file again if the relevant source files have not changed since the last time the JAR file was built. If we want to force Gradle to run a task, we can combine that task with `clean`. Once the build files have been `clean` ed, Gradle has no way to determine if the output will be same as before, so it will be forced to execute the task. +When running a Gradle task, Gradle will try to figure out if the task needs running at all. +If Gradle determines that the output of the task will be same as the previous time, it will not run the task. +For example, it will not build the JAR file again if the relevant source files have not changed since the last time the JAR file was built. +If we want to force Gradle to run a task, we can combine that task with `clean`. +Once the build files have been `clean` ed, Gradle has no way to determine if the output will be same as before, so it will be forced to execute the task. == Creating the JAR file * *`shadowJar`* + -Creates the `addressbook.jar` file in the `build/jar` folder, _if the current file is outdated_. + +Creates the `studybuddy.jar` file in the `build/jar` folder, _if the current file is outdated_. + e.g. `./gradlew shadowJar` **** @@ -51,14 +57,18 @@ e.g. `./gradlew clean shadowJar` **** [NOTE] -*Why do we create a fat JAR?* If we package only our own class files into the JAR file, it will not work properly unless the user has all the other JAR files (i.e. third party libraries) our classes depend on, which is rather inconvenient. Therefore, we package all dependencies into a single JAR files, creating what is also known as a _fat_ JAR file. To create a fat JAR file, we use the Gradle plugin https://github.com/johnrengelman/shadow[shadow jar]. +*Why do we create a fat JAR?* If we package only our own class files into the JAR file, it will not work properly unless the user has all the other JAR files (i.e. third party libraries) our classes depend on, which is rather inconvenient. +Therefore, we package all dependencies into a single JAR files, creating what is also known as a _fat_ JAR file. +To create a fat JAR file, we use the Gradle plugin https://github.com/johnrengelman/shadow[shadow jar]. == Rendering AsciiDoc files * **`asciidoctor`** + -Converts AsciiDoc files in `docs` to HTML format. Generated HTML files can be found in `build/docs`. +Converts AsciiDoc files in `docs` to HTML format. +Generated HTML files can be found in `build/docs`. * **`deployOfflineDocs`** + -Updates the offline user guide, and its associated files, used by the Help window in the application. Deployed HTML files and images can be found in `src/main/resources/docs`. +Updates the offline user guide, and its associated files, used by the Help window in the application. +Deployed HTML files and images can be found in `src/main/resources/docs`. == Running the application @@ -74,7 +84,8 @@ Runs the code style check for the main code base * **`checkstyleTest`** + Runs the code style check for the test code base -The set of code style rules implemented can be found in `config/checkstyle/checkstyle.xml`. To enable _exceptions_ to code styles, add in the comment `//CODESTYLE.OFF: RuleName` at the start of the section and `//CODESTYLE.ON: RuleName` at the end of the section. +The set of code style rules implemented can be found in `config/checkstyle/checkstyle.xml`. +To enable _exceptions_ to code styles, add in the comment `//CODESTYLE.OFF: RuleName` at the start of the section and `//CODESTYLE.ON: RuleName` at the end of the section. == Running Tests diff --git a/docs/UsingNetlify.adoc b/docs/UsingNetlify.adoc index 2e108c936a3..396dce5556d 100644 --- a/docs/UsingNetlify.adoc +++ b/docs/UsingNetlify.adoc @@ -6,25 +6,25 @@ ifdef::env-github[] :note-caption: :information_source: endif::[] -[NOTE] -==== -This document was originally written for _AddressBook Level 4_ and hence its screenshots refer to `addressbook-level4`. -For use with _AddressBook Level 3_, wherever `addressbook-level4` is used in the screenshots, you should use *`addressbook-level3`*. -==== -https://www.netlify.com/[Netlify] is an automated hosting platform for deploying static websites. With the aid of build tools such as Gradle, Netlify provides a smoother experience for previewing documentation. This can be done by using Netlify's https://www.netlify.com/blog/2016/07/20/introducing-deploy-previews-in-netlify/[Deploy Previews] feature, which shows a preview of the updated documentation whenever a pull request is made. +https://www.netlify.com/[Netlify] is an automated hosting platform for deploying static websites. +With the aid of build tools such as Gradle, Netlify provides a smoother experience for previewing documentation. +This can be done by using Netlify's https://www.netlify.com/blog/2016/07/20/introducing-deploy-previews-in-netlify/[Deploy Previews] feature, which shows a preview of the updated documentation whenever a pull request is made. == Setting up Netlify + . Fork the repository to your own organization. + -. Go to https://www.netlify.com/ and click `Sign Up`. Next, click `GITHUB SIGN IN`, enter your GitHub account details and authorize netlify. +. Go to https://www.netlify.com/ and click `Sign Up`. +Next, click `GITHUB SIGN IN`, enter your GitHub account details and authorize netlify. + . After logging in, click `New site from Git`. + -. You will then be brought to the setup page. Click `GitHub` to link your repository to Netlify. +. You will then be brought to the setup page. +Click `GitHub` to link your repository to Netlify. * Depending on whether you are the owner of the repository, you can either grant or request access to Netlify so that it can access your repository and build your documentation. + -image:netlify/grant_or_request_access.png[Grant or request access, width = 630] +image:netlify/grant_or_request_access.png[Grant or request access,width = 630] * After granting or requesting access to your repository, click `Authorize netlify`. + . Pick your repository from the list. @@ -37,23 +37,25 @@ image:netlify/grant_or_request_access.png[Grant or request access, width = 630] The build command is the command that builds the documentation into HTML format. + * Publish directory: `build/docs/html5` + [NOTE] The publish directory is the directory in which the built HTML documentation resides. + . Once Netlify has completed building your project, you can now: * View your main branch's deployed documentation on the site name given by Netlify (customizable as shown <>). + -image:netlify/temp_site_name.png[Temporary site name, width = 630] +image:netlify/temp_site_name.png[Temporary site name,width = 630] + * Preview the updated documentation whenever a pull request is made by clicking the `Details` hyperlink next to the Netlify test status. + -image:netlify/netlify_details.png[Netlify details link, width = 630] +image:netlify/netlify_details.png[Netlify details link,width = 630] == Changing the site name of your project + If you don't like the site name given by Netlify, you can change it as follows: . Click on `Settings`. + . Then click `Change site name` and fill in your desired site name. + -image:netlify/change_site_name.png[Change site name, width = 630] +image:netlify/change_site_name.png[Change site name,width = 630] diff --git a/docs/UsingPlantUml.adoc b/docs/UsingPlantUml.adoc index cfe2533ea84..34dc0b6b1e4 100644 --- a/docs/UsingPlantUml.adoc +++ b/docs/UsingPlantUml.adoc @@ -78,7 +78,7 @@ Then you can use it in another PlantUML file like this: box Logic LOGIC_COLOR_T2 participant ":LogicManager" as LogicManager LOGIC_COLOR -participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":StudyBuddyParser" as StudyBuddyParser LOGIC_COLOR participant ":UndoCommand" as UndoCommand LOGIC_COLOR end box ---- @@ -103,13 +103,14 @@ NOTE: In most cases, you should consider decomposing the diagram into smaller on Here are some of the techniques we used in this project to obtain a more palatable diagram. ==== Link lengths -By default, a short link (`\->`) points to right and a long link (`-\->`) -points downwards. you can extend any link to make it longer (```--\->```). + +By default, a short link (`\->`) points to right and a long link (`-\->`) points downwards. you can extend any link to make it longer (```--\->```). .Length of arrows and its effects image::ArrowLength.png[] ==== Link directions + Clever usage of arrow directions will resolve most layout issues. For example, the table below shows how the way in which you specify arrows can results in drastically different layouts for the same diagram. @@ -172,6 +173,7 @@ C -right[hidden]- D |=== ==== Reordering definitions + As a general rule of thumb, the layout engine will attempt to order objects in the order in which they are defined. If there is no formal definition, the objects is taken to be declared upon its first usage. diff --git a/docs/UsingTravis.adoc b/docs/UsingTravis.adoc index 887c0b09068..f9a44c6e8c5 100644 --- a/docs/UsingTravis.adoc +++ b/docs/UsingTravis.adoc @@ -6,15 +6,11 @@ ifdef::env-github[] :note-caption: :information_source: endif::[] -[NOTE] -==== -This document was originally written for _AddressBook Level 4_ and hence its screenshots refer to `addressbook-level4`. -For use with _AddressBook Level 3_, wherever `addressbook-level4` is used in the screenshots, you should use *`addressbook-level3`*. -==== https://travis-ci.org/[Travis CI] is a _Continuous Integration_ platform for GitHub projects. -Travis CI can run the projects' tests automatically whenever new code is pushed to the repo. This ensures that existing functionality and features have not been broken by the changes. +Travis CI can run the projects' tests automatically whenever new code is pushed to the repo. +This ensures that existing functionality and features have not been broken by the changes. The current Travis CI set up performs the following things whenever someone push code to the repo: @@ -26,17 +22,18 @@ If you would like to customise your travis build further, you can learn more abo == Setting up Travis CI -. Fork the repo to your own organization. -. Go to https://travis-ci.org/ and click `Sign in with GitHub`, then enter your GitHub account details if needed. +. Fork the repo to your own organization. +. Go to https://travis-ci.org/ and click `Sign in with GitHub`, then enter your GitHub account details if needed. + image:signing_in.png[Signing into Travis CI] + -. Head to the https://travis-ci.org/profile[Accounts] page, and find the switch for the forked repository. +. Head to the https://travis-ci.org/profile[Accounts] page, and find the switch for the forked repository. * If the organization is not shown, click `Review and add` as shown below: + image:review_and_add.png[Review and add] + -This should bring you to a GitHub page that manages the access of third-party applications. Depending on whether you are the owner of the repository, you can either grant access +This should bring you to a GitHub page that manages the access of third-party applications. +Depending on whether you are the owner of the repository, you can either grant access + image:grant_access.png[Grant Access] + @@ -46,13 +43,15 @@ image:request_access.png[Request Access] + to Travis CI so that it can access your commits and build your code. * If repository cannot be found, click `Sync account` -. Activate the switch. +. Activate the switch. + image:flick_repository_switch.png[Activate the switch] + -. This repo comes with a link:../.travis.yml[`.travis.yml`] that tells Travis what to do. So there is no need for you to create one yourself. -. To see the CI in action, push a commit to the master branch! -* Go to the repository and see the pushed commit. There should be an icon which will link you to the Travis build. +. This repo comes with a link:../.travis.yml[`.travis.yml`] that tells Travis what to do. +So there is no need for you to create one yourself. +. To see the CI in action, push a commit to the master branch! +* Go to the repository and see the pushed commit. +There should be an icon which will link you to the Travis build. + image:build_pending.png[Commit build] + @@ -60,17 +59,18 @@ image:build_pending.png[Commit build] + image:travis_build.png[Travis build] + -. If the build is successful, you should be able to check the coverage details of the tests at http://coveralls.io/[Coveralls] -. Update the link to the 'build status' badge at the top of the `README.adoc` to point to the build status of your own repo. +. If the build is successful, you should be able to check the coverage details of the tests at http://coveralls.io/[Coveralls] +. Update the link to the 'build status' badge at the top of the `README.adoc` to point to the build status of your own repo. == Enabling auto-publishing of documentation -. Ensure that you have followed the steps above to set up Travis CI. -. On GitHub, create a new user account and give this account collaborator and admin access to the repo. + +. Ensure that you have followed the steps above to set up Travis CI. +. On GitHub, create a new user account and give this account collaborator and admin access to the repo. + Using this account, generate a personal access token https://github.com/settings/tokens/new[here]. + [NOTE] -Personal access tokens are like passwords so make sure you keep them secret! If the personal access token is leaked, please delete it and generate a new one. +Personal access tokens are like passwords so make sure you keep them secret! +If the personal access token is leaked, please delete it and generate a new one. + [NOTE] We use a new user account to generate the token for team projects to prevent team members from gaining access to other team members' repos. + @@ -81,21 +81,24 @@ If you are the only one with write access to the repo, you can use your own acco * Check the `public_repo` checkbox. * Click `Generate Token` and copy your new personal access token. -- + We will use this token to grant Travis access to the repo. + image:generate_token.png[Generate token] -. Head to the https://travis-ci.org/profile[Accounts] page, and find the switch for the forked repository. +. Head to the https://travis-ci.org/profile[Accounts] page, and find the switch for the forked repository. + image:flick_repository_switch.png[Activate the switch] + -. Click on the settings button next to the switch. In the Environment Variables section, add a new environment variable with +. Click on the settings button next to the switch. +In the Environment Variables section, add a new environment variable with + -- * name: `GITHUB_TOKEN` * value: personal access token copied in step 1 * Display value in build log: `OFF` -- + image:travis_add_token.png[Travis add token] + [NOTE] @@ -103,20 +106,25 @@ image:travis_add_token.png[Travis add token] Otherwise, other people will be able to see the personal access token and thus have access this repo. + Similarly, make sure you *do not print `$GITHUB_TOKEN` to the logs* in Travis scripts as the logs are viewable by the public. -. Now, whenever there's a new commit to master branch, Travis will push the latest documentation to gh-pages branch. +. Now, whenever there's a new commit to master branch, Travis will push the latest documentation to gh-pages branch. **To verify that it works,** -. Trigger Travis to regenerate documentation. To do so, you need to push a new commit to the master branch of the fork. + +. Trigger Travis to regenerate documentation. +To do so, you need to push a new commit to the master branch of the fork. + Suggested change: Remove the codacy badge from `README`. -. Wait for Travis CI to finish running the build on your new commit. -. Go to the URL `\https://.github.io/addressbook-level3/index.html`. You should see your `README` file displayed. +. Wait for Travis CI to finish running the build on your new commit. +. Go to the URL `\https://.github.io/studybuddy/index.html`. +You should see your `README` file displayed. == Repository-wide checks -In addition to running Gradle checks, we also configure Travis CI to run 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. +In addition to running Gradle checks, we also configure Travis CI to run 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. -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: +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: [source,shell] ---- @@ -127,7 +135,8 @@ Any warnings or errors will be printed out to the console. === Implementing new checks -Checks are implemented as executable `check-*` scripts within the `config/travis/` directory. The `run-checks.sh` script will automatically pick up and run files named as such. +Checks are implemented as executable `check-*` scripts within the `config/travis/` directory. +The `run-checks.sh` script will automatically pick up and run files named as such. Check scripts should print out errors in the following format: diff --git a/docs/[CS2103T-W16-3][Huang Ge Xiang]UML Diagrams.adoc b/docs/[CS2103T-W16-3][Huang Ge Xiang]UML Diagrams.adoc new file mode 100644 index 00000000000..f9a9cf80d82 --- /dev/null +++ b/docs/[CS2103T-W16-3][Huang Ge Xiang]UML Diagrams.adoc @@ -0,0 +1,66 @@ +:imagesDir: images +:bl: pass:[ +] +:stylesDir: ./stylesheets + +== UML Diagrams + +By: `Huang ge xiang` + +=== CalendarPanel object diagram + +image::CalendarBoxObjectDiagram.png[width = "400", title="Objects in a calendarPanel"] + +*Description:* + + +Shows the objects inside a `CalendarPanel` and how the different objects are related and interact with one another. + +Unimportant objects like labels and backgrounds are left out. + +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} + +=== Archive task Sequence diagram + +image::ArchiveSequenceDiagram.png[width = "600", title="Sequence diagram for archive task"] + +*Description:* + +Explains how tasks are archived. This diagram shows the interaction between logic and model during the command `archive` +and `unarchive`. Future developers can use this as a reference for any new commands. + + +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} +{bl} + + + +=== Calendar view activity diagram + +image::CalendarActivityDiagram.png[width = "500", title="Activity diagram for Calendar view"] + +[teal]#*Description:*# + +Explains the general control flow of the `calendar` command. + diff --git a/docs/[CS2103T-W16-3][Tan Teik Jun]UML Diagrams.adoc b/docs/[CS2103T-W16-3][Tan Teik Jun]UML Diagrams.adoc new file mode 100644 index 00000000000..a229c30e2e3 --- /dev/null +++ b/docs/[CS2103T-W16-3][Tan Teik Jun]UML Diagrams.adoc @@ -0,0 +1,71 @@ +:imagesDir: images +:bl: pass:[ +] +:stylesDir: ./stylesheets + +== UML Diagrams + +By: `Tan Teik Jun` + + +=== Logic Class Diagram + +image::LogicClassDiagram.png[width = "850", title="Logic Class Diagram"] + +[teal]#*Description:*# + +This Class Diagram explains the interactions between the +classes within the Logic Component. +It also explains how the Logic Component interacts with the Model component. + +This diagram provides a high-level abstraction of the `Logic` component of the architecture. The detailed implementation is handled by other +diagrams in the Developer Guide. + +Developers can use this high-level +overview to understand the `Logic` Component, +before diving into the detailed implementation of the `Logic` Component. + + +{bl} +{bl} +{bl} +{bl} + + +=== List Sequence Diagram + +image::ListTaskSequenceDiagram.png[width = "700", title="Sequence diagram for archive task"] + +*Description:* + +This Sequence Diagram explains how the `list` command works. This is used as an example to illustrate how the `Logic` Component works. + +This diagram shows the interaction between Ui, Logic and Model during the command `list`. Developers can use this as a reference for any new commands. + +{bl} + +=== Productivity Feature Object Diagram + +image::ProductivityObjectDiagram.png[width = "750", title="Objects used for Productivity Feature"] + +*Description:* + + +This Object Diagram displays the objects used to record statistics needed for Productivity Feature. +It also shows how the different objects are related and interact with one another. + + +This diagram is useful for developers who wish to modify how the Productivity feature works. +Objects used to display the Ui (e.g. labels and panes) are excluded from this diagram. + + +=== Productivity Feature Activity Diagram + +image::ProductivityActivityDiagram.png[width = "300", title="Activity diagram for Productivity Feature"] + +[teal]#*Description:*# + +This Activity Diagram illustrates an example use scenario for the Productivity Feature. +This diagram helps developers to understand the motivation behind the +Productivity Feature. + +This diagram also helps to explain how the daily goal and streak mechanism works in StudyBuddy. +It shows that the user's streak is updated when the daily goal is reached. + +With this understanding, developers can easily modify +the current behavior of the Productivity Feature. + diff --git a/docs/diagrams/AddDueSoonActivityDiagram.puml b/docs/diagrams/AddDueSoonActivityDiagram.puml new file mode 100644 index 00000000000..d139a575f35 --- /dev/null +++ b/docs/diagrams/AddDueSoonActivityDiagram.puml @@ -0,0 +1,23 @@ +@startuml +start + +skinparam ActivityBackgroundColor #tan +skinparam ActivityBorderColor #black +skinparam activityDiamondBorderColor #black +skinparam activityDiamondBackgroundColor #tan +skinparam arrowColor #black + +:User executes add command; + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +if () then ([task is Due Soon]) + :add task to Due Soon list; +else ([else]) +endif; + +:add task to main list; + +stop +@enduml diff --git a/docs/diagrams/AddDueSoonSequence.puml b/docs/diagrams/AddDueSoonSequence.puml new file mode 100644 index 00000000000..b870d76b575 --- /dev/null +++ b/docs/diagrams/AddDueSoonSequence.puml @@ -0,0 +1,67 @@ +@startuml +!include style.puml + +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 2 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 2 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + + +box UI UI_COLOR_T1 +participant ":UI" as UI UI_COLOR +end box + +box Logic LOGIC_COLOR_T1 +participant ":AddTaskInteractivePrompt" as AddTaskInteractivePrompt UI_COLOR +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddTaskCommand" as AddTaskCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant ":StudyBuddy" as StudyBuddy MODEL_COLOR +end box + +UI-> AddTaskInteractivePrompt : execute(due soon) +activate AddTaskInteractivePrompt + +AddTaskInteractivePrompt -> LogicManager : execute() +activate LogicManager + +LogicManager -> AddTaskCommand : execute() +activate AddTaskCommand + +AddTaskCommand -> Model : addTask() +activate Model + +Model -> StudyBuddy : addTask() +activate StudyBuddy + +alt is due soon + StudyBuddy->StudyBuddy: addDueSoonTask() + StudyBuddy --> Model +else else + StudyBuddy --> Model +end + +deactivate StudyBuddy + +Model --> AddTaskCommand +deactivate Model + +AddTaskCommand --> LogicManager +deactivate AddTaskCommand +destroy AddTaskCommand + +LogicManager --> AddTaskInteractivePrompt +deactivate LogicManager + +UI<--AddTaskInteractivePrompt +deactivate AddTaskInteractivePrompt +destroy AddTaskInteractivePrompt + +@enduml diff --git a/docs/diagrams/AddTaskObjectDiagram.puml b/docs/diagrams/AddTaskObjectDiagram.puml new file mode 100644 index 00000000000..14e78f1cdaf --- /dev/null +++ b/docs/diagrams/AddTaskObjectDiagram.puml @@ -0,0 +1,36 @@ +@startuml +!include style.puml + +skinparam DiagramBorderThickness 2 +skinparam arrowThickness 1.1 +skinparam arrowColor #black +skinparam classBackgroundColor STORAGE_COLOR +skinparam classBorderColor #black + +package UI { +Class :CommandBox +} + +package Logic { +Class :AddTaskInteractivePrompt +Class :AddTaskCommand +Class :LogicManager +} + +package Storage { +Class :HiddenStorage #FFFFFF +} + +":CommandBox" -right- ":AddTaskInteractivePrompt" + +":AddTaskInteractivePrompt" -- ":LogicManager" + +":LogicManager" -right- ":HiddenStorage" + +":LogicManager" -- ":AddTaskCommand" + +note "The HiddenStorage \nrepresents the less important details \nfrom Storage components" as N1 UI_COLOR_NOTE + + + +@enduml diff --git a/docs/diagrams/ArchitectureDiagram.puml b/docs/diagrams/ArchitectureDiagram.puml index d021b3992ed..5168e3d8331 100644 --- a/docs/diagrams/ArchitectureDiagram.puml +++ b/docs/diagrams/ArchitectureDiagram.puml @@ -9,8 +9,8 @@ Package " "<>{ Class Logic LOGIC_COLOR Class Storage STORAGE_COLOR Class Model MODEL_COLOR - Class Main MODEL_COLOR_T1 - Class Commons LOGIC_COLOR_T2 + Class Main MODEL_COLOR + Class Commons UI_COLOR_T2 Class "Log Center" as Logs UI_COLOR_T2 Class Hidden #FFFFFF Class HiddenUI #FFFFFF @@ -18,7 +18,7 @@ Package " "<>{ } -Class "<$user>" as User MODEL_COLOR_T2 +Class "<$user>" as User MODEL_COLOR_T1 Class "<$documents>" as File UI_COLOR_T1 diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml index d1e2ae93675..5c801667980 100644 --- a/docs/diagrams/ArchitectureSequenceDiagram.puml +++ b/docs/diagrams/ArchitectureSequenceDiagram.puml @@ -1,37 +1,46 @@ @startuml !include style.puml +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 2 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 2 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + Actor User as user USER_COLOR Participant ":UI" as ui UI_COLOR Participant ":Logic" as logic LOGIC_COLOR Participant ":Model" as model MODEL_COLOR Participant ":Storage" as storage STORAGE_COLOR -user -[USER_COLOR]> ui : "delete 1" +user -> ui : "delete 1" activate ui UI_COLOR -ui -[UI_COLOR]> logic : execute("delete 1") +ui -> logic : execute("delete 1") activate logic LOGIC_COLOR -logic -[LOGIC_COLOR]> model : deletePerson(p) +logic -> model : deleteTask(t) activate model MODEL_COLOR -model -[MODEL_COLOR]-> logic +model --> logic deactivate model -logic -[LOGIC_COLOR]> storage : saveAddressBook(addressBook) +logic -> storage : saveStudyBuddy(studybuddy) activate storage STORAGE_COLOR -storage -[STORAGE_COLOR]> storage : Save to file +storage -> storage : Save to file activate storage STORAGE_COLOR_T1 deactivate storage -storage --[STORAGE_COLOR]> logic +storage --> logic deactivate storage -logic --[LOGIC_COLOR]> ui +logic --> ui deactivate logic -ui--[UI_COLOR]> user +ui--> user deactivate ui @enduml diff --git a/docs/diagrams/ArchiveSequenceDiagram.puml b/docs/diagrams/ArchiveSequenceDiagram.puml new file mode 100644 index 00000000000..4b9d3878bb1 --- /dev/null +++ b/docs/diagrams/ArchiveSequenceDiagram.puml @@ -0,0 +1,59 @@ +@startuml +!include style.puml + +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 2 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 2 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + +box Logic LOGIC_COLOR_T1 +participant ":ArchiveTaskInteractive" as ArchiveTaskInteractive LOGIC_COLOR +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ArchiveTaskCommand" as ArchiveTaskCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +end box + +[-> ArchiveTaskInteractive : interact("archive") +activate ArchiveTaskInteractive + +[<-- ArchiveTaskInteractive : reply() + +[-> ArchiveTaskInteractive : interact(1) + +create ArchiveTaskCommand +ArchiveTaskInteractive -> ArchiveTaskCommand +activate ArchiveTaskCommand + +ArchiveTaskCommand --> ArchiveTaskInteractive +deactivate ArchiveTaskCommand + +ArchiveTaskInteractive -> LogicManager : executeCommand(ArchiveTaskCommand) +activate LogicManager + +LogicManager -> ArchiveTaskCommand : execute() +activate ArchiveTaskCommand + +ArchiveTaskCommand -> Model : archive(1) +activate Model + +Model --> ArchiveTaskCommand +deactivate Model + +ArchiveTaskCommand --> LogicManager +deactivate ArchiveTaskCommand +destroy ArchiveTaskCommand + +LogicManager --> ArchiveTaskInteractive +deactivate LogicManager + +[<-- ArchiveTaskInteractive : reply() +deactivate ArchiveTaskInteractive +destroy ArchiveTaskInteractive +@enduml diff --git a/docs/diagrams/BetterModelClassDiagram.puml b/docs/diagrams/BetterModelClassDiagram.puml deleted file mode 100644 index 7790472da52..00000000000 --- a/docs/diagrams/BetterModelClassDiagram.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -!include style.puml -skinparam arrowThickness 1.1 -skinparam arrowColor MODEL_COLOR -skinparam classBackgroundColor MODEL_COLOR - -AddressBook *-right-> "1" UniquePersonList -AddressBook *-right-> "1" UniqueTagList -UniqueTagList -[hidden]down- UniquePersonList -UniqueTagList -[hidden]down- UniquePersonList - -UniqueTagList *-right-> "*" Tag -UniquePersonList o-right-> Person - -Person o-up-> "*" Tag - -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address -@enduml diff --git a/docs/diagrams/CalendarActivityDiagram.puml b/docs/diagrams/CalendarActivityDiagram.puml new file mode 100644 index 00000000000..7cc1b6e27ed --- /dev/null +++ b/docs/diagrams/CalendarActivityDiagram.puml @@ -0,0 +1,28 @@ +@startuml +start +skinparam ActivityBackgroundColor #tan +skinparam ActivityBorderColor #black +skinparam activityDiamondBorderColor #black +skinparam activityDiamondBackgroundColor #tan +skinparam arrowColor #black + +:User requests for a calendar; + +label lab1 +:User enters the date he wants for the calendar; + + +:Time parser parses the date; + +if () then ([Selected date is within +50 years of current date]) + +:Calendar is generated; +:Tasks due on selected date is added to task panel; +else ([else]) +:Error is thrown; +endif + +:User sees calendar with all tasks on selected date; +stop +@enduml diff --git a/docs/diagrams/CalendarBoxObjectDiagram.puml b/docs/diagrams/CalendarBoxObjectDiagram.puml new file mode 100644 index 00000000000..2dcad9ecbce --- /dev/null +++ b/docs/diagrams/CalendarBoxObjectDiagram.puml @@ -0,0 +1,29 @@ +@startuml + +skinparam objectBackgroundColor #tan +skinparam objectBorderColor #black +skinparam arrowColor #black + +object "calendarPanel:CalendarPanel" as cb { +calYear:2020 +calMonth:April +} + +object "monthBox:GridPane" as mb +object "next:Button" as next +object "previous:Button" as prev +object "p:Pane" as pane +object "date:Label" as lbl { +date:1 +} + + +cb -- mb : contains > +next -- mb : changes > +prev -- mb : changes > +cb -- next : contains > +cb -- prev : contains > +mb *-- pane : contains > +mb *-- lbl : contains > + +@enduml diff --git a/docs/diagrams/CommitActivityDiagram.puml b/docs/diagrams/CommitActivityDiagram.puml deleted file mode 100644 index 7f8fe407f89..00000000000 --- a/docs/diagrams/CommitActivityDiagram.puml +++ /dev/null @@ -1,15 +0,0 @@ -@startuml -start -:User executes command; - -'Since the beta syntax does not support placing the condition outside the -'diamond we place it as the true branch instead. - -if () then ([command commits AddressBook]) - :Purge redunant states; - :Save AddressBook to - addressBookStateList; -else ([else]) -endif -stop -@enduml diff --git a/docs/diagrams/DeleteDueSoonActivityDiagram.puml b/docs/diagrams/DeleteDueSoonActivityDiagram.puml new file mode 100644 index 00000000000..b0ebdc56933 --- /dev/null +++ b/docs/diagrams/DeleteDueSoonActivityDiagram.puml @@ -0,0 +1,23 @@ +@startuml +start + +skinparam ActivityBackgroundColor #tan +skinparam ActivityBorderColor #black +skinparam activityDiamondBorderColor #black +skinparam activityDiamondBackgroundColor #tan +skinparam arrowColor #black + +:User executes delete command; + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +if () then ([task is in due soon list]) + :delete task from due soon list; +else ([else]) +endif; + +:delete task from main list; + +stop +@enduml diff --git a/docs/diagrams/DeleteDueSoonSequence.puml b/docs/diagrams/DeleteDueSoonSequence.puml new file mode 100644 index 00000000000..3b1a513918e --- /dev/null +++ b/docs/diagrams/DeleteDueSoonSequence.puml @@ -0,0 +1,67 @@ +@startuml +!include style.puml + +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 2 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 2 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + + +box UI UI_COLOR_T1 +participant ":UI" as UI UI_COLOR +end box + +box Logic LOGIC_COLOR_T1 +participant ":DeleteTaskInteractivePrompt" as DeleteTaskInteractivePrompt LOGIC_COLOR +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":DeleteTaskCommand" as DeleteTaskCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant ":StudyBuddy" as StudyBuddy MODEL_COLOR +end box + +UI-> DeleteTaskInteractivePrompt : execute(due soon) +activate DeleteTaskInteractivePrompt + +DeleteTaskInteractivePrompt -> LogicManager : execute() +activate LogicManager + +LogicManager -> DeleteTaskCommand : execute() +activate DeleteTaskCommand + +DeleteTaskCommand -> Model : deleteTask() +activate Model + +Model -> StudyBuddy : deleteTask() +activate StudyBuddy + +alt present in due soon list + StudyBuddy->StudyBuddy: deleteDueSoonTask() + StudyBuddy --> Model +else else + StudyBuddy --> Model +end + +deactivate StudyBuddy + +Model --> DeleteTaskCommand +deactivate Model + +DeleteTaskCommand --> LogicManager +deactivate DeleteTaskCommand +destroy DeleteTaskCommand + +LogicManager --> DeleteTaskInteractivePrompt +deactivate LogicManager + +UI<--DeleteTaskInteractivePrompt +deactivate DeleteTaskInteractivePrompt +destroy DeleteTaskInteractivePrompt + +@enduml diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 1dc2311b245..9b05720fe9f 100644 --- a/docs/diagrams/DeleteSequenceDiagram.puml +++ b/docs/diagrams/DeleteSequenceDiagram.puml @@ -3,7 +3,7 @@ box Logic LOGIC_COLOR_T1 participant ":LogicManager" as LogicManager LOGIC_COLOR -participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":StudyBuddyParser" as StudyBuddyParser LOGIC_COLOR participant ":DeleteCommandParser" as DeleteCommandParser LOGIC_COLOR participant "d:DeleteCommand" as DeleteCommand LOGIC_COLOR participant ":CommandResult" as CommandResult LOGIC_COLOR @@ -16,17 +16,17 @@ end box [-> LogicManager : execute("delete 1") activate LogicManager -LogicManager -> AddressBookParser : parseCommand("delete 1") -activate AddressBookParser +LogicManager -> StudyBuddyParser : parseCommand("delete 1") +activate StudyBuddyParser create DeleteCommandParser -AddressBookParser -> DeleteCommandParser +StudyBuddyParser -> DeleteCommandParser activate DeleteCommandParser -DeleteCommandParser --> AddressBookParser +DeleteCommandParser --> StudyBuddyParser deactivate DeleteCommandParser -AddressBookParser -> DeleteCommandParser : parse("1") +StudyBuddyParser -> DeleteCommandParser : parse("1") activate DeleteCommandParser create DeleteCommand @@ -36,14 +36,14 @@ activate DeleteCommand DeleteCommand --> DeleteCommandParser : d deactivate DeleteCommand -DeleteCommandParser --> AddressBookParser : d +DeleteCommandParser --> StudyBuddyParser : d deactivate DeleteCommandParser 'Hidden arrow to position the destroy marker below the end of the activation bar. -DeleteCommandParser -[hidden]-> AddressBookParser +DeleteCommandParser -[hidden]-> StudyBuddyParser destroy DeleteCommandParser -AddressBookParser --> LogicManager : d -deactivate AddressBookParser +StudyBuddyParser --> LogicManager : d +deactivate StudyBuddyParser LogicManager -> DeleteCommand : execute() activate DeleteCommand diff --git a/docs/diagrams/DueSoonActivityDiagram.puml b/docs/diagrams/DueSoonActivityDiagram.puml new file mode 100644 index 00000000000..2d72dd47502 --- /dev/null +++ b/docs/diagrams/DueSoonActivityDiagram.puml @@ -0,0 +1,28 @@ +@startuml +start + +skinparam ActivityBackgroundColor #tan +skinparam ActivityBorderColor #black +skinparam activityDiamondBorderColor #black +skinparam activityDiamondBackgroundColor #tan +skinparam arrowColor #black + +:User executes refresh command; + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. +: Study Buddy traverses Due Soon list; + +if () then ([task is Due Soon]) + if () then ([task is not present in Due Soon list]) + :Add task to Due Soon list; + else ([else]) + endif +else ([else]) + if () then ([Due Soon list contains task]) + :Delete task from Due Soon list; + else ([else]) + endif; +endif; +stop +@enduml diff --git a/docs/diagrams/DueSoonSequenceDiagram.puml b/docs/diagrams/DueSoonSequenceDiagram.puml new file mode 100644 index 00000000000..db55f680606 --- /dev/null +++ b/docs/diagrams/DueSoonSequenceDiagram.puml @@ -0,0 +1,61 @@ +@startuml +!include style.puml + +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 2 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 2 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + + +box UI UI_COLOR_T1 +participant ":UI" as UI UI_COLOR +end box + +box Logic LOGIC_COLOR_T1 +participant ":RefreshTaskInteractivePrompt" as RefreshTaskInteractivePrompt LOGIC_COLOR +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":RefreshCommand" as RefreshCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant ":StudyBuddy" as StudyBuddy MODEL_COLOR +end box + +UI-> RefreshTaskInteractivePrompt : execute(due soon) +activate RefreshTaskInteractivePrompt + +RefreshTaskInteractivePrompt -> LogicManager : execute() +activate LogicManager + +LogicManager -> RefreshCommand : execute() +activate RefreshCommand + +RefreshCommand -> Model : addDueSoonTask() +activate Model + +Model -> StudyBuddy : addDueSoonTask() +activate StudyBuddy + +StudyBuddy --> Model +deactivate StudyBuddy + +Model --> RefreshCommand +deactivate Model + +RefreshCommand --> LogicManager +deactivate RefreshCommand +destroy RefreshCommand + +LogicManager --> RefreshTaskInteractivePrompt +deactivate LogicManager + +UI<--RefreshTaskInteractivePrompt +deactivate RefreshTaskInteractivePrompt +destroy RefreshTaskInteractivePrompt + +@enduml diff --git a/docs/diagrams/ListTaskSequenceDiagram.puml b/docs/diagrams/ListTaskSequenceDiagram.puml new file mode 100644 index 00000000000..d4cf8dd6927 --- /dev/null +++ b/docs/diagrams/ListTaskSequenceDiagram.puml @@ -0,0 +1,57 @@ +@startuml +!include style.puml + +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 1 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 1 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + + +box UI UI_COLOR_T1 +participant ":UI" as UI UI_COLOR +end box + +box Logic LOGIC_COLOR_T1 +participant ":ListTaskInteractivePrompt" as ListTaskInteractivePrompt LOGIC_COLOR +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ListTaskCommand" as ListTaskCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":ModelManager" as Model MODEL_COLOR + +end box + +UI -> ListTaskInteractivePrompt : execute("list") +activate ListTaskInteractivePrompt + +ListTaskInteractivePrompt -> LogicManager : executeCommand() +activate LogicManager + +LogicManager -> ListTaskCommand : execute() +activate ListTaskCommand + +ListTaskCommand -> Model : updateFilteredTaskList() +activate Model + + + +Model --> ListTaskCommand +deactivate Model + +ListTaskCommand --> LogicManager +deactivate ListTaskCommand +destroy ListTaskCommand + +LogicManager --> ListTaskInteractivePrompt +deactivate LogicManager + +UI<--ListTaskInteractivePrompt +deactivate ListTaskInteractivePrompt +destroy ListTaskInteractivePrompt + +@enduml diff --git a/docs/diagrams/LogicClassDiagram.puml b/docs/diagrams/LogicClassDiagram.puml index 016ef33e2e2..729d8be170f 100644 --- a/docs/diagrams/LogicClassDiagram.puml +++ b/docs/diagrams/LogicClassDiagram.puml @@ -3,18 +3,14 @@ skinparam arrowThickness 1.1 skinparam arrowColor LOGIC_COLOR_T4 skinparam classBackgroundColor LOGIC_COLOR +skinparam classBorderColor #black package Logic { package Parser { -Interface Parser <> -Class AddressBookParser -Class XYZCommandParser -Class CliSyntax -Class ParserUtil -Class ArgumentMultimap -Class ArgumentTokenizer -Class Prefix +Class TaskParser +Class TimeParser +Class StudyBuddyParser } package Command { @@ -23,6 +19,10 @@ Class CommandResult Class "{abstract}\nCommand" as Command } +package InteractivePrompt { +Class XYZInteractivePrompt +} + Interface Logic <> Class LogicManager } @@ -31,32 +31,27 @@ package Model{ Class HiddenModel #FFFFFF } -Class HiddenOutside #FFFFFF -HiddenOutside ..> Logic +XYZInteractivePrompt .>Parser : uses +XYZInteractivePrompt .>XYZCommand : creates -LogicManager .up.|> Logic -LogicManager -->"1" AddressBookParser -AddressBookParser .left.> XYZCommandParser: creates > - -XYZCommandParser ..> XYZCommand : creates > -XYZCommandParser ..|> Parser -XYZCommandParser ..> ArgumentMultimap -XYZCommandParser ..> ArgumentTokenizer -ArgumentTokenizer .left.> ArgumentMultimap -XYZCommandParser ..> CliSyntax -CliSyntax ..> Prefix -XYZCommandParser ..> ParserUtil -ParserUtil .down.> Prefix -ArgumentTokenizer .down.> Prefix -XYZCommand -up-|> Command -LogicManager .left.> Command : executes > - -LogicManager --> Model Command .right.> Model -note right of XYZCommand: XYZCommand = AddCommand, \nFindCommand, etc +LogicManager -down-> Model + +Model.[hidden].> LogicManager + + + +XYZCommand .up.|> Command +LogicManager .up.|> Logic + + Logic ..> CommandResult -LogicManager .down.> CommandResult +LogicManager .down> CommandResult : executes Command .up.> CommandResult -CommandResult -[hidden]-> Parser + + +note right of XYZInteractivePrompt: XYZInteractivePrompt includes \nAddTaskInteractivePrompt, \nFindTaskInteractivePrompt, etc.\n\nSimilarly,\nXYZCommand includes \nAddTaskCommand, \nFindTaskCommand, etc. + + @enduml diff --git a/docs/diagrams/ModelClassDiagram.puml b/docs/diagrams/ModelClassDiagram.puml index e85a00d4107..b6950c42554 100644 --- a/docs/diagrams/ModelClassDiagram.puml +++ b/docs/diagrams/ModelClassDiagram.puml @@ -3,25 +3,25 @@ skinparam arrowThickness 1.1 skinparam arrowColor MODEL_COLOR skinparam classBackgroundColor MODEL_COLOR +skinparam classBorderColor #black +skinparam arrowColor #black Package Model <>{ -Interface ReadOnlyAddressBook <> +Interface ReadOnlyStudyBuddy <> Interface Model <> Interface ObservableList <> -Class AddressBook -Class ReadOnlyAddressBook +Class StudyBuddy +Class ReadOnlyStudyBuddy Class Model Class ModelManager Class UserPrefs Class ReadOnlyUserPrefs -Package Person { -Class Person -Class Address -Class Email -Class Name -Class Phone -Class UniquePersonList +Package Task { +Class UniqueTaskList +Class Task +Enum TaskStatus +Enum TaskType } Package Tag { @@ -32,25 +32,22 @@ Class Tag Class HiddenOutside #FFFFFF HiddenOutside ..> Model -AddressBook .up.|> ReadOnlyAddressBook +StudyBuddy .up.|> ReadOnlyStudyBuddy ModelManager .up.|> Model Model .right.> ObservableList -ModelManager o--> "1" AddressBook +ModelManager o--> "1" StudyBuddy ModelManager o-left-> "1" UserPrefs UserPrefs .up.|> ReadOnlyUserPrefs -AddressBook *--> "1" UniquePersonList -UniquePersonList o--> "*" Person -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address -Person *--> "*" Tag +StudyBuddy *--> "1" UniqueTaskList -Name -[hidden]right-> Phone -Phone -[hidden]right-> Address -Address -[hidden]right-> Email +UniqueTaskList o-> "*" Task +Task *--> TaskStatus +Task *--> TaskType -ModelManager -->"1" Person : filtered list +Task *--> "*" Tag + +ModelManager -->"1" Task : filtered list @enduml + diff --git a/docs/diagrams/ModuleSequenceDiagram.puml b/docs/diagrams/ModuleSequenceDiagram.puml new file mode 100644 index 00000000000..bd41e39fd32 --- /dev/null +++ b/docs/diagrams/ModuleSequenceDiagram.puml @@ -0,0 +1,117 @@ +@startuml +!include style.puml + +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 2 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 2 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + +Actor user + +box UI UI_COLOR_T1 +participant ":CreateModule\nInteractivePrompt" as CreateModuleInteractivePrompt UI_COLOR +end box + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":CreateMod\nCommand" as CreateModCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Module" as Module MODEL_COLOR +participant ":ModuleCode" as ModuleCode MODEL_COLOR +participant ":Model" as Model MODEL_COLOR +participant ":StudyBuddy" as StudyBuddy MODEL_COLOR +participant ":ModuleList" as ModuleList MODEL_COLOR +end box + +create CreateModuleInteractivePrompt +user --> CreateModuleInteractivePrompt +activate CreateModuleInteractivePrompt + +create Module +CreateModuleInteractivePrompt -> Module:EmptyModule() +activate Module + +CreateModuleInteractivePrompt <-- Module +deactivate Module + +user <-- CreateModuleInteractivePrompt:reply +user -> CreateModuleInteractivePrompt: interact() + +CreateModuleInteractivePrompt -> Module:setModuleName() +activate Module + +CreateModuleInteractivePrompt <-- Module +deactivate Module + +user <-- CreateModuleInteractivePrompt:reply +user -> CreateModuleInteractivePrompt: interact() + +CreateModuleInteractivePrompt -> Module:setModuleCode() +activate Module + +create ModuleCode +Module -> ModuleCode +activate ModuleCode + +ModuleCode -> Module +deactivate ModuleCode + +CreateModuleInteractivePrompt <-- Module +deactivate Module + +user <-- CreateModuleInteractivePrompt:reply +user -> CreateModuleInteractivePrompt: interact() + +create CreateModCommand +CreateModuleInteractivePrompt -> CreateModCommand +activate CreateModCommand + +CreateModCommand --> CreateModuleInteractivePrompt + +CreateModuleInteractivePrompt -> LogicManager: executeCommand\n(CreateModCommand) +activate LogicManager + +LogicManager -> CreateModCommand:execute() + +CreateModCommand -> Model:addMod(module) +activate Model + +Model -> StudyBuddy: addModule(module) +activate StudyBuddy + +StudyBuddy -> ModuleList:add(module) +activate ModuleList + +ModuleList --> ModuleList: boolean\ncontains(module) + +ModuleList --> StudyBuddy +deactivate ModuleList + +StudyBuddy --> Model +deactivate StudyBuddy + +Model --> CreateModCommand +deactivate Model + +CreateModCommand --> LogicManager +destroy CreateModCommand + +LogicManager --> CreateModuleInteractivePrompt +deactivate LogicManager + +CreateModuleInteractivePrompt --> user:reply +destroy CreateModuleInteractivePrompt + + + + + + + +@enduml diff --git a/docs/diagrams/ProductivityActivityDiagram.puml b/docs/diagrams/ProductivityActivityDiagram.puml new file mode 100644 index 00000000000..a64f0c37741 --- /dev/null +++ b/docs/diagrams/ProductivityActivityDiagram.puml @@ -0,0 +1,22 @@ +@startuml + +skinparam ActivityBackgroundColor #tan +skinparam ActivityBorderColor #black +skinparam activityDiamondBorderColor #black +skinparam activityDiamondBackgroundColor #tan +skinparam arrowColor #black + +start +:User clicks Productivity menu item; +:User is directed to Daily Productivity Tab; +:User executes done command; +:StudyBuddy updates productivity page; +if () then ([User reach daily goal]) +:User's streak is incremented; +else +endif +stop + +@enduml + + diff --git a/docs/diagrams/ProductivityObjectDiagram.puml b/docs/diagrams/ProductivityObjectDiagram.puml new file mode 100644 index 00000000000..a6f7e36bbde --- /dev/null +++ b/docs/diagrams/ProductivityObjectDiagram.puml @@ -0,0 +1,44 @@ +@startuml + +skinparam objectBackgroundColor #tan +skinparam objectBorderColor #black +skinparam arrowColor #black + +object "statistics:Statistics" as s { +} + +object "generalStats:GeneralStats" as gs { + goal + streak + isStreakAddedList +} +object "scoreStats:ScoreStats" as ss { + currentScore + scoreList +} +object "completionStats:CompletionStats" as cs { + completeCountList +} +object "overdueStats:OverdueStats" as os { + overdueCountList +} + +object ":StatsUtil" as su +interface "goalObserver:GoalObserver" as go { + update() +} + +s*--cs +s*--os +s*--ss +s*--gs + +s.>su +ss..>su +gs..>su + +gs..>go + + + +@enduml diff --git a/docs/diagrams/QuitFromInteractionActivityDiagram.puml b/docs/diagrams/QuitFromInteractionActivityDiagram.puml new file mode 100644 index 00000000000..7733a7d446a --- /dev/null +++ b/docs/diagrams/QuitFromInteractionActivityDiagram.puml @@ -0,0 +1,22 @@ +@startuml +!include style.puml + +skinparam DiagramBorderThickness 2 +skinparam ActivityBackgroundColor UI_COLOR +skinparam ActivityBorderColor #black +skinparam activityDiamondBorderColor #black +skinparam activityDiamondBackgroundColor UI_COLOR +skinparam arrowColor #black + +|User| +start +:launch Study Buddy; +:type add and press enter to add a new task; +|#AntiqueWhite|UI| +:ask for the task's module information; +|User| +:type quit and press enter; +|UI| +:quit from the add task interaction; +stop +@enduml diff --git a/docs/diagrams/StorageClassDiagram.puml b/docs/diagrams/StorageClassDiagram.puml index 6adb2e156bf..9493aeba5ef 100644 --- a/docs/diagrams/StorageClassDiagram.puml +++ b/docs/diagrams/StorageClassDiagram.puml @@ -1,24 +1,28 @@ @startuml !include style.puml + skinparam arrowThickness 1.1 -skinparam arrowColor STORAGE_COLOR +skinparam arrowColor #black skinparam classBackgroundColor STORAGE_COLOR +skinparam classBorderColor #black +package Storage { Interface Storage <> Interface UserPrefsStorage <> -Interface AddressBookStorage <> +Interface StudyBuddyStorage <> Class StorageManager Class JsonUserPrefsStorage -Class JsonAddressBookStorage +Class JsonStudyBuddyStorage StorageManager .left.|> Storage StorageManager o-right-> UserPrefsStorage -StorageManager o--> AddressBookStorage +StorageManager o--> StudyBuddyStorage JsonUserPrefsStorage .left.|> UserPrefsStorage -JsonAddressBookStorage .left.|> AddressBookStorage -JsonAddressBookStorage .down.> JsonSerializableAddressBookStorage -JsonSerializableAddressBookStorage .right.> JsonSerializablePerson -JsonSerializablePerson .right.> JsonAdaptedTag +JsonStudyBuddyStorage .left.|> StudyBuddyStorage +JsonStudyBuddyStorage .down.> JsonSerializableStudyBuddyStorage +JsonSerializableStudyBuddyStorage .right.> JsonSerializableTask +JsonSerializableTask .right.> JsonAdaptedTag +} @enduml diff --git a/docs/diagrams/TaskSummaryOnClickActivityDiagram.puml b/docs/diagrams/TaskSummaryOnClickActivityDiagram.puml new file mode 100644 index 00000000000..2f1566056d3 --- /dev/null +++ b/docs/diagrams/TaskSummaryOnClickActivityDiagram.puml @@ -0,0 +1,29 @@ +@startuml +!include style.puml + +skinparam DiagramBorderThickness 2 +skinparam ActivityBackgroundColor UI_COLOR +skinparam ActivityBorderColor #black +skinparam activityDiamondBorderColor #black +skinparam activityDiamondBackgroundColor UI_COLOR +skinparam arrowColor #black + +|User| +start +:launch Study Buddy; +|#AntiqueWhite|UI| + :render the charts using the records loaded from storage; +|User| +:click on a particular portion of a chart; +|UI| +: check the records one by one; +while () is ([not reach the end of records]) + if () then ([current record is related to the clicked portion]) + :add it into a filtered record list; + else ([else]) + endif +endwhile ([else]]) +: render the Task List Panel using the filtered record list; +stop + +@enduml diff --git a/docs/diagrams/TaskSummaryOnDataChangeSequenceDiagram.puml b/docs/diagrams/TaskSummaryOnDataChangeSequenceDiagram.puml new file mode 100644 index 00000000000..ff2ec00c664 --- /dev/null +++ b/docs/diagrams/TaskSummaryOnDataChangeSequenceDiagram.puml @@ -0,0 +1,42 @@ +@startuml +!include style.puml + +skinparam arrowColor #black +skinparam SequenceBoxBorderColor #black +skinparam SequenceParticipantBorderThickness 2 +skinparam SequenceReferenceBorderThickness 2 +skinparam DiagramBorderThickness 2 +skinparam SequenceArrowThickness 2 +skinparam SequenceLifeLineBorderColor #black +skinparam ParticipantBorderColor #black + +actor User + +participant ":UI" as UI UI_COLOR +participant ":Logic" as Logic UI_COLOR +participant ":Model" as Model UI_COLOR + +User -> UI : interact(new data) +activate UI + +UI -> Logic : executeCommand(updateCommand) +activate Logic +note right UI_COLOR_NOTE: updateCommand\n can be add, edit, delete etc. \ncommands + +Logic -> Model : saveStudyBuddy(updated StudyBuddy) +deactivate Logic +activate Model + + +Model -> Model : saveStudyBuddy(updated StudyBuddy) +activate Model +deactivate Model +deactivate Model + +UI -> UI : render() +note right UI_COLOR_NOTE: the UI detects module change \nand renders automatically +activate UI +deactivate UI +UI --> User: show latest statistics +deactivate UI +@enduml diff --git a/docs/diagrams/UiClassDiagram.puml b/docs/diagrams/UiClassDiagram.puml index 92746f9fcf7..fd6e37a4862 100644 --- a/docs/diagrams/UiClassDiagram.puml +++ b/docs/diagrams/UiClassDiagram.puml @@ -1,20 +1,23 @@ @startuml !include style.puml + +skinparam DiagramBorderThickness 2 skinparam arrowThickness 1.1 skinparam arrowColor UI_COLOR_T4 skinparam classBackgroundColor UI_COLOR +skinparam classBorderColor #black + package UI <>{ -Interface Ui <> -Class "{abstract}\nUiPart" as UiPart -Class UiManager +Class XYZPanel +Class XYZCard +Class CommandBox +CLass FeedbackDisplayBox Class MainWindow -Class HelpWindow -Class ResultDisplay -Class PersonListPanel -Class PersonCard Class StatusBarFooter -Class CommandBox +Interface Ui <> +Class UiManager +Class "{abstract}\nUiPart" as UiPart } package Model <> { @@ -25,36 +28,52 @@ package Logic <> { Class HiddenLogic #FFFFFF } -Class HiddenOutside #FFFFFF -HiddenOutside ..> Ui UiManager .left.|> Ui + + UiManager -down-> MainWindow -MainWindow --> HelpWindow -MainWindow *-down-> CommandBox -MainWindow *-down-> ResultDisplay -MainWindow *-down-> PersonListPanel MainWindow *-down-> StatusBarFooter +MainWindow *-down-> CommandBox +MainWindow *-down-> FeedbackDisplayBox +MainWindow *-down-> XYZPanel +XYZPanel *-down-> XYZCard -PersonListPanel -down-> PersonCard -MainWindow -left-|> UiPart +StatusBarFooter -right[hidden]- FeedbackDisplayBox +MainWindow -down[hidden]- UiManager + -ResultDisplay --|> UiPart +MainWindow -left-|> UiPart +XYZCard --|> UiPart +XYZPanel --|> UiPart CommandBox --|> UiPart -PersonListPanel --|> UiPart -PersonCard --|> UiPart +FeedbackDisplayBox --|> UiPart StatusBarFooter --|> UiPart -HelpWindow -down-|> UiPart -PersonCard ..> Model + +XYZCard ..> Model +XYZPanel ..> Model + + UiManager -right-> Logic MainWindow -left-> Logic +CommandBox -left-> Logic + +CommandBox -left[hidden]- FeedbackDisplayBox +MainWindow -down[hidden]- UiPart + +note right of XYZPanel UI_COLOR_NOTE +XYZPanel = CalendarPanel, +DueSoonListPanel, ModuleListPanel, +ProductivityPanel, TaskListPanel, +TaskSummaryPanel +end note -PersonListPanel -[hidden]left- HelpWindow -HelpWindow -[hidden]left- CommandBox -CommandBox -[hidden]left- ResultDisplay -ResultDisplay -[hidden]left- StatusBarFooter +note right of XYZCard UI_COLOR_NOTE +XYZCard = DetailedTaskCard, +DueSoonTaskCard, ModCard +end note -MainWindow -[hidden]-|> UiPart +note "The HiddenLogic and HiddenModel \nrepresent the less important details \nfrom Logic and Model components" as N1 UI_COLOR_NOTE @enduml diff --git a/docs/diagrams/UndoRedoState0.puml b/docs/diagrams/UndoRedoState0.puml deleted file mode 100644 index 96e30744d24..00000000000 --- a/docs/diagrams/UndoRedoState0.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 - -title Initial state - -package States { - class State1 as "__ab0:AddressBook__" - class State2 as "__ab1:AddressBook__" - class State3 as "__ab2:AddressBook__" -} -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 -hide State2 -hide State3 - -class Pointer as "Current State" #FFFFF -Pointer -up-> State1 -@end diff --git a/docs/diagrams/UndoRedoState1.puml b/docs/diagrams/UndoRedoState1.puml deleted file mode 100644 index 01fcb9b2b96..00000000000 --- a/docs/diagrams/UndoRedoState1.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 - -title After command "delete 5" - -package States <> { - class State1 as "__ab0:AddressBook__" - class State2 as "__ab1:AddressBook__" - class State3 as "__ab2:AddressBook__" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -hide State3 - -class Pointer as "Current State" #FFFFF - -Pointer -up-> State2 -@end diff --git a/docs/diagrams/UndoRedoState2.puml b/docs/diagrams/UndoRedoState2.puml deleted file mode 100644 index bccc230a5d1..00000000000 --- a/docs/diagrams/UndoRedoState2.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 - -title After command "add n/David" - -package States <> { - class State1 as "__ab0:AddressBook__" - class State2 as "__ab1:AddressBook__" - class State3 as "__ab2:AddressBook__" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFF - -Pointer -up-> State3 -@end diff --git a/docs/diagrams/UndoRedoState3.puml b/docs/diagrams/UndoRedoState3.puml deleted file mode 100644 index ea29c9483e4..00000000000 --- a/docs/diagrams/UndoRedoState3.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 - -title After command "undo" - -package States <> { - class State1 as "__ab0:AddressBook__" - class State2 as "__ab1:AddressBook__" - class State3 as "__ab2:AddressBook__" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFF - -Pointer -up-> State2 -@end diff --git a/docs/diagrams/UndoRedoState4.puml b/docs/diagrams/UndoRedoState4.puml deleted file mode 100644 index 1b784cece80..00000000000 --- a/docs/diagrams/UndoRedoState4.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 - -title After command "list" - -package States <> { - class State1 as "__ab0:AddressBook__" - class State2 as "__ab1:AddressBook__" - class State3 as "__ab2:AddressBook__" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFF - -Pointer -up-> State2 -@end diff --git a/docs/diagrams/UndoRedoState5.puml b/docs/diagrams/UndoRedoState5.puml deleted file mode 100644 index 88927be32bc..00000000000 --- a/docs/diagrams/UndoRedoState5.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 - -title After command "clear" - -package States <> { - class State1 as "__ab0:AddressBook__" - class State2 as "__ab1:AddressBook__" - class State3 as "__ab3:AddressBook__" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFF - -Pointer -up-> State3 -note right on link: State ab2 deleted. -@end diff --git a/docs/diagrams/UndoSequenceDiagram.puml b/docs/diagrams/UndoSequenceDiagram.puml deleted file mode 100644 index 410aab4e412..00000000000 --- a/docs/diagrams/UndoSequenceDiagram.puml +++ /dev/null @@ -1,53 +0,0 @@ -@startuml -!include style.puml - -box Logic LOGIC_COLOR_T1 -participant ":LogicManager" as LogicManager LOGIC_COLOR -participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR -participant "u:UndoCommand" as UndoCommand LOGIC_COLOR -end box - -box Model MODEL_COLOR_T1 -participant ":Model" as Model MODEL_COLOR -participant ":VersionedAddressBook" as VersionedAddressBook MODEL_COLOR -end box -[-> LogicManager : execute(undo) -activate LogicManager - -LogicManager -> AddressBookParser : parseCommand(undo) -activate AddressBookParser - -create UndoCommand -AddressBookParser -> UndoCommand -activate UndoCommand - -UndoCommand --> AddressBookParser -deactivate UndoCommand - -AddressBookParser --> LogicManager : u -deactivate AddressBookParser - -LogicManager -> UndoCommand : execute() -activate UndoCommand - -UndoCommand -> Model : undoAddressBook() -activate Model - -Model -> VersionedAddressBook : undo() -activate VersionedAddressBook - -VersionedAddressBook -> VersionedAddressBook :resetData(ReadOnlyAddressBook) -VersionedAddressBook --> Model : -deactivate VersionedAddressBook - -Model --> UndoCommand -deactivate Model - -UndoCommand --> LogicManager : result -deactivate UndoCommand -UndoCommand -[hidden]-> LogicManager : result -destroy UndoCommand - -[<--LogicManager -deactivate LogicManager -@enduml diff --git a/docs/diagrams/style.puml b/docs/diagrams/style.puml index fad8b0adeaa..f4001ad4da3 100644 --- a/docs/diagrams/style.puml +++ b/docs/diagrams/style.puml @@ -7,29 +7,30 @@ 'T1 through T4 are shades of the original color from lightest to darkest -!define UI_COLOR #1D8900 -!define UI_COLOR_T1 #83E769 +!define UI_COLOR #D2B48C +!define UI_COLOR_T1 #FFFFFF !define UI_COLOR_T2 #3FC71B -!define UI_COLOR_T3 #166800 -!define UI_COLOR_T4 #0E4100 +!define UI_COLOR_T3 #000000 +!define UI_COLOR_T4 #000000 +!define UI_COLOR_NOTE #c2d7f3 -!define LOGIC_COLOR #3333C4 -!define LOGIC_COLOR_T1 #C8C8FA -!define LOGIC_COLOR_T2 #6A6ADC -!define LOGIC_COLOR_T3 #1616B0 -!define LOGIC_COLOR_T4 #101086 +!define LOGIC_COLOR #D2B48C +!define LOGIC_COLOR_T1 #FFFFFF +!define LOGIC_COLOR_T2 #000000 +!define LOGIC_COLOR_T3 #000000 +!define LOGIC_COLOR_T4 #000000 -!define MODEL_COLOR #9D0012 -!define MODEL_COLOR_T1 #F97181 -!define MODEL_COLOR_T2 #E41F36 -!define MODEL_COLOR_T3 #7B000E -!define MODEL_COLOR_T4 #51000A +!define MODEL_COLOR #D2B48C +!define MODEL_COLOR_T1 #FFFFFF +!define MODEL_COLOR_T2 #000000 +!define MODEL_COLOR_T3 #000000 +!define MODEL_COLOR_T4 #000000 -!define STORAGE_COLOR #A38300 -!define STORAGE_COLOR_T1 #FFE374 -!define STORAGE_COLOR_T2 #EDC520 -!define STORAGE_COLOR_T3 #806600 -!define STORAGE_COLOR_T2 #544400 +!define STORAGE_COLOR #D2B48C +!define STORAGE_COLOR_T1 #FFFFFF +!define STORAGE_COLOR_T2 #000000 +!define STORAGE_COLOR_T3 #000000 +!define STORAGE_COLOR_T2 #000000 !define USER_COLOR #000000 @@ -38,7 +39,7 @@ skinparam BackgroundColor #FFFFFFF skinparam Shadowing false skinparam Class { - FontColor #FFFFFF + FontColor #000000 BorderThickness 1 BorderColor #FFFFFF StereotypeFontColor #FFFFFF @@ -55,12 +56,12 @@ skinparam Sequence { MessageAlign center BoxFontSize 15 BoxPadding 0 - BoxFontColor #FFFFFF + BoxFontColor #000000 FontName Arial } skinparam Participant { - FontColor #FFFFFFF + FontColor #000000 Padding 20 } diff --git a/docs/diagrams/tracing/LogicSequenceDiagram.puml b/docs/diagrams/tracing/LogicSequenceDiagram.puml index fdcbe1c0ccc..358a363f65e 100644 --- a/docs/diagrams/tracing/LogicSequenceDiagram.puml +++ b/docs/diagrams/tracing/LogicSequenceDiagram.puml @@ -2,7 +2,7 @@ !include ../style.puml Participant ":LogicManager" as logic LOGIC_COLOR -Participant ":AddressBookParser" as abp LOGIC_COLOR +Participant ":StudyBuddyParser" as abp LOGIC_COLOR Participant ":EditCommandParser" as ecp LOGIC_COLOR Participant "command:EditCommand" as ec LOGIC_COLOR diff --git a/docs/images/AddDueSoonActivityDiagram.png b/docs/images/AddDueSoonActivityDiagram.png new file mode 100644 index 00000000000..a619b610f3b Binary files /dev/null and b/docs/images/AddDueSoonActivityDiagram.png differ diff --git a/docs/images/AddDueSoonSequence.png b/docs/images/AddDueSoonSequence.png new file mode 100644 index 00000000000..bf7b6f80f50 Binary files /dev/null and b/docs/images/AddDueSoonSequence.png differ diff --git a/docs/images/AddTaskObjectDiagram.png b/docs/images/AddTaskObjectDiagram.png new file mode 100644 index 00000000000..88ed947ba8d Binary files /dev/null and b/docs/images/AddTaskObjectDiagram.png differ diff --git a/docs/images/ArchitectureDiagram.png b/docs/images/ArchitectureDiagram.png index aa2d337d932..33a9277f9ab 100644 Binary files a/docs/images/ArchitectureDiagram.png and b/docs/images/ArchitectureDiagram.png differ diff --git a/docs/images/ArchitectureSequenceDiagram.png b/docs/images/ArchitectureSequenceDiagram.png index aa198138f8f..45ced7af5a0 100644 Binary files a/docs/images/ArchitectureSequenceDiagram.png and b/docs/images/ArchitectureSequenceDiagram.png differ diff --git a/docs/images/ArchiveSequenceDiagram.png b/docs/images/ArchiveSequenceDiagram.png new file mode 100644 index 00000000000..514917646e0 Binary files /dev/null and b/docs/images/ArchiveSequenceDiagram.png differ diff --git a/docs/images/CalendarActivityDiagram.png b/docs/images/CalendarActivityDiagram.png new file mode 100644 index 00000000000..a2f56a4143a Binary files /dev/null and b/docs/images/CalendarActivityDiagram.png differ diff --git a/docs/images/CalendarBoxObjectDiagram.png b/docs/images/CalendarBoxObjectDiagram.png new file mode 100644 index 00000000000..2cb72bfa43c Binary files /dev/null and b/docs/images/CalendarBoxObjectDiagram.png differ diff --git a/docs/images/DeleteDueSoonActivityDiagram.png b/docs/images/DeleteDueSoonActivityDiagram.png new file mode 100644 index 00000000000..7ee085fba05 Binary files /dev/null and b/docs/images/DeleteDueSoonActivityDiagram.png differ diff --git a/docs/images/DeleteDueSoonSequence.png b/docs/images/DeleteDueSoonSequence.png new file mode 100644 index 00000000000..1a87173796d Binary files /dev/null and b/docs/images/DeleteDueSoonSequence.png differ diff --git a/docs/images/DueSoonActivityDiagram.png b/docs/images/DueSoonActivityDiagram.png new file mode 100644 index 00000000000..472dd995fa5 Binary files /dev/null and b/docs/images/DueSoonActivityDiagram.png differ diff --git a/docs/images/DueSoonSequenceDiagram.png b/docs/images/DueSoonSequenceDiagram.png new file mode 100644 index 00000000000..770627f700a Binary files /dev/null and b/docs/images/DueSoonSequenceDiagram.png differ diff --git a/docs/images/ListTaskSequenceDiagram.png b/docs/images/ListTaskSequenceDiagram.png new file mode 100644 index 00000000000..886559e94f7 Binary files /dev/null and b/docs/images/ListTaskSequenceDiagram.png differ diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png index b9e853cef12..2b3f6d11c4c 100644 Binary files a/docs/images/LogicClassDiagram.png and b/docs/images/LogicClassDiagram.png differ diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png index 280064118cf..32c4302251f 100644 Binary files a/docs/images/ModelClassDiagram.png and b/docs/images/ModelClassDiagram.png differ diff --git a/docs/images/ModuleSequenceDiagram.png b/docs/images/ModuleSequenceDiagram.png new file mode 100644 index 00000000000..00a27048069 Binary files /dev/null and b/docs/images/ModuleSequenceDiagram.png differ diff --git a/docs/images/ProductivityActivityDiagram.png b/docs/images/ProductivityActivityDiagram.png new file mode 100644 index 00000000000..e9e8a9f26f1 Binary files /dev/null and b/docs/images/ProductivityActivityDiagram.png differ diff --git a/docs/images/ProductivityObjectDiagram.png b/docs/images/ProductivityObjectDiagram.png new file mode 100644 index 00000000000..579ae0b90a1 Binary files /dev/null and b/docs/images/ProductivityObjectDiagram.png differ diff --git a/docs/images/QuitFromInteractionActivityDiagram.png b/docs/images/QuitFromInteractionActivityDiagram.png new file mode 100644 index 00000000000..e671477020f Binary files /dev/null and b/docs/images/QuitFromInteractionActivityDiagram.png differ diff --git a/docs/images/SouwmyaaUML.png b/docs/images/SouwmyaaUML.png new file mode 100644 index 00000000000..7ee085fba05 Binary files /dev/null and b/docs/images/SouwmyaaUML.png differ diff --git a/docs/images/StorageClassDiagram.png b/docs/images/StorageClassDiagram.png index d87c1216820..d5405c499ab 100644 Binary files a/docs/images/StorageClassDiagram.png and b/docs/images/StorageClassDiagram.png differ diff --git a/docs/images/TaskSummaryOnClickActivityDiagram.png b/docs/images/TaskSummaryOnClickActivityDiagram.png new file mode 100644 index 00000000000..73127f3edfa Binary files /dev/null and b/docs/images/TaskSummaryOnClickActivityDiagram.png differ diff --git a/docs/images/TaskSummaryOnDataChangeSequenceDiagram.png b/docs/images/TaskSummaryOnDataChangeSequenceDiagram.png new file mode 100644 index 00000000000..bbfc75110af Binary files /dev/null and b/docs/images/TaskSummaryOnDataChangeSequenceDiagram.png differ diff --git a/docs/images/Ui.png b/docs/images/Ui.png index 5bd77847aa2..cb7ea3fdbab 100644 Binary files a/docs/images/Ui.png and b/docs/images/Ui.png differ diff --git a/docs/images/UiClassDiagram.png b/docs/images/UiClassDiagram.png index 7b4b3dbea45..be8048b8d17 100644 Binary files a/docs/images/UiClassDiagram.png and b/docs/images/UiClassDiagram.png differ diff --git a/docs/images/UndoRedoState0.png b/docs/images/UndoRedoState0.png deleted file mode 100644 index 8f7538cd884..00000000000 Binary files a/docs/images/UndoRedoState0.png and /dev/null differ diff --git a/docs/images/UndoRedoState1.png b/docs/images/UndoRedoState1.png deleted file mode 100644 index df9908d0948..00000000000 Binary files a/docs/images/UndoRedoState1.png and /dev/null differ diff --git a/docs/images/UndoRedoState2.png b/docs/images/UndoRedoState2.png deleted file mode 100644 index 36519c1015b..00000000000 Binary files a/docs/images/UndoRedoState2.png and /dev/null differ diff --git a/docs/images/UndoRedoState3.png b/docs/images/UndoRedoState3.png deleted file mode 100644 index 19959d01712..00000000000 Binary files a/docs/images/UndoRedoState3.png and /dev/null differ diff --git a/docs/images/UndoRedoState4.png b/docs/images/UndoRedoState4.png deleted file mode 100644 index 4c623e4f2c5..00000000000 Binary files a/docs/images/UndoRedoState4.png and /dev/null differ diff --git a/docs/images/UndoRedoState5.png b/docs/images/UndoRedoState5.png deleted file mode 100644 index 84ad2afa6bd..00000000000 Binary files a/docs/images/UndoRedoState5.png and /dev/null differ diff --git a/docs/images/UndoSequenceDiagram.png b/docs/images/UndoSequenceDiagram.png deleted file mode 100644 index 6addcd3a8d9..00000000000 Binary files a/docs/images/UndoSequenceDiagram.png and /dev/null differ diff --git a/docs/images/add-remark/$Remark.png b/docs/images/add-remark/$Remark.png deleted file mode 100644 index 959c634406d..00000000000 Binary files a/docs/images/add-remark/$Remark.png and /dev/null differ diff --git a/docs/images/add-remark/CommandInterface.png b/docs/images/add-remark/CommandInterface.png deleted file mode 100644 index b52e7811c52..00000000000 Binary files a/docs/images/add-remark/CommandInterface.png and /dev/null differ diff --git a/docs/images/add-remark/ContextMenu.png b/docs/images/add-remark/ContextMenu.png deleted file mode 100644 index 77536724e45..00000000000 Binary files a/docs/images/add-remark/ContextMenu.png and /dev/null differ diff --git a/docs/images/add-remark/CreateTest.png b/docs/images/add-remark/CreateTest.png deleted file mode 100644 index 6b7d6dcafec..00000000000 Binary files a/docs/images/add-remark/CreateTest.png and /dev/null differ diff --git a/docs/images/add-remark/GradleRun.png b/docs/images/add-remark/GradleRun.png deleted file mode 100644 index 281cc45f098..00000000000 Binary files a/docs/images/add-remark/GradleRun.png and /dev/null differ diff --git a/docs/images/add-remark/ParserInterface.png b/docs/images/add-remark/ParserInterface.png deleted file mode 100644 index 60c7892a534..00000000000 Binary files a/docs/images/add-remark/ParserInterface.png and /dev/null differ diff --git a/docs/images/add-remark/RemarkBound.png b/docs/images/add-remark/RemarkBound.png deleted file mode 100644 index d335382b286..00000000000 Binary files a/docs/images/add-remark/RemarkBound.png and /dev/null differ diff --git a/docs/images/add-remark/RemarkComplete.png b/docs/images/add-remark/RemarkComplete.png deleted file mode 100644 index 124ced2c752..00000000000 Binary files a/docs/images/add-remark/RemarkComplete.png and /dev/null differ diff --git a/docs/images/add-remark/RemarkFailureOutput.png b/docs/images/add-remark/RemarkFailureOutput.png deleted file mode 100644 index 351257ea332..00000000000 Binary files a/docs/images/add-remark/RemarkFailureOutput.png and /dev/null differ diff --git a/docs/images/add-remark/RemarkHello.png b/docs/images/add-remark/RemarkHello.png deleted file mode 100644 index aad48d02f8f..00000000000 Binary files a/docs/images/add-remark/RemarkHello.png and /dev/null differ diff --git a/docs/images/add-remark/RemarkNotImplemented.png b/docs/images/add-remark/RemarkNotImplemented.png deleted file mode 100644 index 1d187f39403..00000000000 Binary files a/docs/images/add-remark/RemarkNotImplemented.png and /dev/null differ diff --git a/docs/images/aegis-bot.png b/docs/images/aegis-bot.png new file mode 100644 index 00000000000..2a62ac6b358 Binary files /dev/null and b/docs/images/aegis-bot.png differ diff --git a/docs/images/appveyor/add-project-1.png b/docs/images/appveyor/add-project-1.png deleted file mode 100755 index a244bce0146..00000000000 Binary files a/docs/images/appveyor/add-project-1.png and /dev/null differ diff --git a/docs/images/appveyor/add-project-2.png b/docs/images/appveyor/add-project-2.png deleted file mode 100755 index 7578f8214a8..00000000000 Binary files a/docs/images/appveyor/add-project-2.png and /dev/null differ diff --git a/docs/images/appveyor/add-project-3.png b/docs/images/appveyor/add-project-3.png deleted file mode 100755 index c38f521621f..00000000000 Binary files a/docs/images/appveyor/add-project-3.png and /dev/null differ diff --git a/docs/images/appveyor/ci-log.png b/docs/images/appveyor/ci-log.png deleted file mode 100644 index 40e0f5a52d9..00000000000 Binary files a/docs/images/appveyor/ci-log.png and /dev/null differ diff --git a/docs/images/appveyor/ci-pending.png b/docs/images/appveyor/ci-pending.png deleted file mode 100644 index a7d2359994f..00000000000 Binary files a/docs/images/appveyor/ci-pending.png and /dev/null differ diff --git a/docs/images/appveyor/login.png b/docs/images/appveyor/login.png deleted file mode 100755 index e5719a54604..00000000000 Binary files a/docs/images/appveyor/login.png and /dev/null differ diff --git a/docs/images/appveyor/project-settings-1.png b/docs/images/appveyor/project-settings-1.png deleted file mode 100755 index b772b3f6842..00000000000 Binary files a/docs/images/appveyor/project-settings-1.png and /dev/null differ diff --git a/docs/images/appveyor/project-settings-2.png b/docs/images/appveyor/project-settings-2.png deleted file mode 100755 index 5ff7f15e46f..00000000000 Binary files a/docs/images/appveyor/project-settings-2.png and /dev/null differ diff --git a/docs/images/appveyor/project-settings-3.png b/docs/images/appveyor/project-settings-3.png deleted file mode 100755 index 30485db350d..00000000000 Binary files a/docs/images/appveyor/project-settings-3.png and /dev/null differ diff --git a/docs/images/basic/add/add_date_time.png b/docs/images/basic/add/add_date_time.png new file mode 100644 index 00000000000..3603cfbea8b Binary files /dev/null and b/docs/images/basic/add/add_date_time.png differ diff --git a/docs/images/basic/add/add_desc.png b/docs/images/basic/add/add_desc.png new file mode 100644 index 00000000000..49323a5f5db Binary files /dev/null and b/docs/images/basic/add/add_desc.png differ diff --git a/docs/images/basic/add/add_module.png b/docs/images/basic/add/add_module.png new file mode 100644 index 00000000000..583feec5079 Binary files /dev/null and b/docs/images/basic/add/add_module.png differ diff --git a/docs/images/basic/add/add_result.png b/docs/images/basic/add/add_result.png new file mode 100644 index 00000000000..918ea308b77 Binary files /dev/null and b/docs/images/basic/add/add_result.png differ diff --git a/docs/images/basic/add/add_task_info_1.png b/docs/images/basic/add/add_task_info_1.png new file mode 100644 index 00000000000..4050af2d434 Binary files /dev/null and b/docs/images/basic/add/add_task_info_1.png differ diff --git a/docs/images/basic/add/add_task_info_2.png b/docs/images/basic/add/add_task_info_2.png new file mode 100644 index 00000000000..ed4917b8fd6 Binary files /dev/null and b/docs/images/basic/add/add_task_info_2.png differ diff --git a/docs/images/basic/add/add_task_name.png b/docs/images/basic/add/add_task_name.png new file mode 100644 index 00000000000..ab252cfb39b Binary files /dev/null and b/docs/images/basic/add/add_task_name.png differ diff --git a/docs/images/basic/add/add_task_type.png b/docs/images/basic/add/add_task_type.png new file mode 100644 index 00000000000..34264f37b7e Binary files /dev/null and b/docs/images/basic/add/add_task_type.png differ diff --git a/docs/images/basic/add/add_time_cost.png b/docs/images/basic/add/add_time_cost.png new file mode 100644 index 00000000000..e0f5786c165 Binary files /dev/null and b/docs/images/basic/add/add_time_cost.png differ diff --git a/docs/images/basic/add/add_weight.png b/docs/images/basic/add/add_weight.png new file mode 100644 index 00000000000..11b62468e3d Binary files /dev/null and b/docs/images/basic/add/add_weight.png differ diff --git a/docs/images/basic/archive/archive_confirm.png b/docs/images/basic/archive/archive_confirm.png new file mode 100644 index 00000000000..2c94749618b Binary files /dev/null and b/docs/images/basic/archive/archive_confirm.png differ diff --git a/docs/images/basic/archive/archive_index.png b/docs/images/basic/archive/archive_index.png new file mode 100644 index 00000000000..4d883cc1ccb Binary files /dev/null and b/docs/images/basic/archive/archive_index.png differ diff --git a/docs/images/basic/archive/archive_list.png b/docs/images/basic/archive/archive_list.png new file mode 100644 index 00000000000..00acc01aba7 Binary files /dev/null and b/docs/images/basic/archive/archive_list.png differ diff --git a/docs/images/basic/archive/archive_result.png b/docs/images/basic/archive/archive_result.png new file mode 100644 index 00000000000..ed3a33ecb79 Binary files /dev/null and b/docs/images/basic/archive/archive_result.png differ diff --git a/docs/images/basic/archive/check_archive.png b/docs/images/basic/archive/check_archive.png new file mode 100644 index 00000000000..473aad03b2d Binary files /dev/null and b/docs/images/basic/archive/check_archive.png differ diff --git a/docs/images/basic/clear/clear_confirm.png b/docs/images/basic/clear/clear_confirm.png new file mode 100644 index 00000000000..db9df596f33 Binary files /dev/null and b/docs/images/basic/clear/clear_confirm.png differ diff --git a/docs/images/basic/clear/clear_no_result.png b/docs/images/basic/clear/clear_no_result.png new file mode 100644 index 00000000000..6a62530d445 Binary files /dev/null and b/docs/images/basic/clear/clear_no_result.png differ diff --git a/docs/images/basic/clear/clear_result.png b/docs/images/basic/clear/clear_result.png new file mode 100644 index 00000000000..f32b22c896a Binary files /dev/null and b/docs/images/basic/clear/clear_result.png differ diff --git a/docs/images/basic/delete/delete_confirm.png b/docs/images/basic/delete/delete_confirm.png new file mode 100644 index 00000000000..323cb216424 Binary files /dev/null and b/docs/images/basic/delete/delete_confirm.png differ diff --git a/docs/images/basic/delete/delete_index.png b/docs/images/basic/delete/delete_index.png new file mode 100644 index 00000000000..5926ef9f1d5 Binary files /dev/null and b/docs/images/basic/delete/delete_index.png differ diff --git a/docs/images/basic/delete/delete_result.png b/docs/images/basic/delete/delete_result.png new file mode 100644 index 00000000000..b9e883e604e Binary files /dev/null and b/docs/images/basic/delete/delete_result.png differ diff --git a/docs/images/basic/done/done_confirm.png b/docs/images/basic/done/done_confirm.png new file mode 100644 index 00000000000..c8ffc172616 Binary files /dev/null and b/docs/images/basic/done/done_confirm.png differ diff --git a/docs/images/basic/done/done_index.png b/docs/images/basic/done/done_index.png new file mode 100644 index 00000000000..729edbce06b Binary files /dev/null and b/docs/images/basic/done/done_index.png differ diff --git a/docs/images/basic/done/done_result.png b/docs/images/basic/done/done_result.png new file mode 100644 index 00000000000..747c2bea031 Binary files /dev/null and b/docs/images/basic/done/done_result.png differ diff --git a/docs/images/basic/edit/archive_3.png b/docs/images/basic/edit/archive_3.png new file mode 100644 index 00000000000..ab2170334ef Binary files /dev/null and b/docs/images/basic/edit/archive_3.png differ diff --git a/docs/images/basic/edit/edit_index.png b/docs/images/basic/edit/edit_index.png new file mode 100644 index 00000000000..985d143efeb Binary files /dev/null and b/docs/images/basic/edit/edit_index.png differ diff --git a/docs/images/basic/edit/edit_response_index.png b/docs/images/basic/edit/edit_response_index.png new file mode 100644 index 00000000000..9697ace8567 Binary files /dev/null and b/docs/images/basic/edit/edit_response_index.png differ diff --git a/docs/images/basic/edit/edit_response_task_name.png b/docs/images/basic/edit/edit_response_task_name.png new file mode 100644 index 00000000000..c251455cded Binary files /dev/null and b/docs/images/basic/edit/edit_response_task_name.png differ diff --git a/docs/images/basic/edit/edit_result.png b/docs/images/basic/edit/edit_result.png new file mode 100644 index 00000000000..d237a41e282 Binary files /dev/null and b/docs/images/basic/edit/edit_result.png differ diff --git a/docs/images/basic/exit/exit_confirm.png b/docs/images/basic/exit/exit_confirm.png new file mode 100644 index 00000000000..0445e4dfa29 Binary files /dev/null and b/docs/images/basic/exit/exit_confirm.png differ diff --git a/docs/images/basic/exit/exit_no.png b/docs/images/basic/exit/exit_no.png new file mode 100644 index 00000000000..37e074a93d4 Binary files /dev/null and b/docs/images/basic/exit/exit_no.png differ diff --git a/docs/images/basic/filter/filter_status.png b/docs/images/basic/filter/filter_status.png new file mode 100644 index 00000000000..358d77364c3 Binary files /dev/null and b/docs/images/basic/filter/filter_status.png differ diff --git a/docs/images/basic/filter/filter_status_result.png b/docs/images/basic/filter/filter_status_result.png new file mode 100644 index 00000000000..0c4359fcd6a Binary files /dev/null and b/docs/images/basic/filter/filter_status_result.png differ diff --git a/docs/images/basic/filter/filter_term.png b/docs/images/basic/filter/filter_term.png new file mode 100644 index 00000000000..c99cbb47381 Binary files /dev/null and b/docs/images/basic/filter/filter_term.png differ diff --git a/docs/images/basic/filter/filter_type.png b/docs/images/basic/filter/filter_type.png new file mode 100644 index 00000000000..f8c58714e5f Binary files /dev/null and b/docs/images/basic/filter/filter_type.png differ diff --git a/docs/images/basic/filter/filter_type_result.png b/docs/images/basic/filter/filter_type_result.png new file mode 100644 index 00000000000..671de8ac0ba Binary files /dev/null and b/docs/images/basic/filter/filter_type_result.png differ diff --git a/docs/images/basic/find/find_keyword.png b/docs/images/basic/find/find_keyword.png new file mode 100644 index 00000000000..40788582548 Binary files /dev/null and b/docs/images/basic/find/find_keyword.png differ diff --git a/docs/images/basic/find/find_result.png b/docs/images/basic/find/find_result.png new file mode 100644 index 00000000000..9a1092d1f09 Binary files /dev/null and b/docs/images/basic/find/find_result.png differ diff --git a/docs/images/basic/help/help_rep.png b/docs/images/basic/help/help_rep.png new file mode 100644 index 00000000000..153baf2257f Binary files /dev/null and b/docs/images/basic/help/help_rep.png differ diff --git a/docs/images/basic/list/list_result.png b/docs/images/basic/list/list_result.png new file mode 100644 index 00000000000..9644d9d23fa Binary files /dev/null and b/docs/images/basic/list/list_result.png differ diff --git a/docs/images/basic/refresh/refresh_before.png b/docs/images/basic/refresh/refresh_before.png new file mode 100644 index 00000000000..5d5d5aa41d5 Binary files /dev/null and b/docs/images/basic/refresh/refresh_before.png differ diff --git a/docs/images/basic/refresh/refresh_result.png b/docs/images/basic/refresh/refresh_result.png new file mode 100644 index 00000000000..cc1a87eceea Binary files /dev/null and b/docs/images/basic/refresh/refresh_result.png differ diff --git a/docs/images/basic/sort/sort_confirm.png b/docs/images/basic/sort/sort_confirm.png new file mode 100644 index 00000000000..ae4520cb03c Binary files /dev/null and b/docs/images/basic/sort/sort_confirm.png differ diff --git a/docs/images/basic/sort/sort_result.png b/docs/images/basic/sort/sort_result.png new file mode 100644 index 00000000000..5b54841fd1b Binary files /dev/null and b/docs/images/basic/sort/sort_result.png differ diff --git a/docs/images/basic/sort/sort_term.png b/docs/images/basic/sort/sort_term.png new file mode 100644 index 00000000000..61542bc6d9c Binary files /dev/null and b/docs/images/basic/sort/sort_term.png differ diff --git a/docs/images/basic/viewrenamed/viewRenamed1.png b/docs/images/basic/viewrenamed/viewRenamed1.png new file mode 100644 index 00000000000..91611f7a2c7 Binary files /dev/null and b/docs/images/basic/viewrenamed/viewRenamed1.png differ diff --git a/docs/images/basic/viewrenamed/viewRenamed2.png b/docs/images/basic/viewrenamed/viewRenamed2.png new file mode 100644 index 00000000000..39e36e5ab2f Binary files /dev/null and b/docs/images/basic/viewrenamed/viewRenamed2.png differ diff --git a/docs/images/calendar/Calendar_CLI_Date.png b/docs/images/calendar/Calendar_CLI_Date.png new file mode 100644 index 00000000000..fef73f14968 Binary files /dev/null and b/docs/images/calendar/Calendar_CLI_Date.png differ diff --git a/docs/images/calendar/calendar_after_CLI.png b/docs/images/calendar/calendar_after_CLI.png new file mode 100644 index 00000000000..4d71d7fb289 Binary files /dev/null and b/docs/images/calendar/calendar_after_CLI.png differ diff --git a/docs/images/calendar/calendar_after_choose_date.png b/docs/images/calendar/calendar_after_choose_date.png new file mode 100644 index 00000000000..baa2d4d4911 Binary files /dev/null and b/docs/images/calendar/calendar_after_choose_date.png differ diff --git a/docs/images/calendar/calendar_click.png b/docs/images/calendar/calendar_click.png new file mode 100644 index 00000000000..c43454df0cd Binary files /dev/null and b/docs/images/calendar/calendar_click.png differ diff --git a/docs/images/calendar/calendar_init.png b/docs/images/calendar/calendar_init.png new file mode 100644 index 00000000000..bd2a7c900b0 Binary files /dev/null and b/docs/images/calendar/calendar_init.png differ diff --git a/docs/images/coveralls/badge_repo.png b/docs/images/coveralls/badge_repo.png deleted file mode 100644 index e653ffd0782..00000000000 Binary files a/docs/images/coveralls/badge_repo.png and /dev/null differ diff --git a/docs/images/coveralls/coverage_asciidoc_code.png b/docs/images/coveralls/coverage_asciidoc_code.png deleted file mode 100644 index fc6d925d838..00000000000 Binary files a/docs/images/coveralls/coverage_asciidoc_code.png and /dev/null differ diff --git a/docs/images/coveralls/coverage_report.png b/docs/images/coveralls/coverage_report.png deleted file mode 100644 index 8fdfc7da1bd..00000000000 Binary files a/docs/images/coveralls/coverage_report.png and /dev/null differ diff --git a/docs/images/coveralls/disable_comments.png b/docs/images/coveralls/disable_comments.png deleted file mode 100644 index 2023de102b6..00000000000 Binary files a/docs/images/coveralls/disable_comments.png and /dev/null differ diff --git a/docs/images/coveralls/flick_repository_switch.png b/docs/images/coveralls/flick_repository_switch.png deleted file mode 100644 index 5900dc88387..00000000000 Binary files a/docs/images/coveralls/flick_repository_switch.png and /dev/null differ diff --git a/docs/images/coveralls/github_settings.png b/docs/images/coveralls/github_settings.png deleted file mode 100644 index 728fe2bfaea..00000000000 Binary files a/docs/images/coveralls/github_settings.png and /dev/null differ diff --git a/docs/images/coveralls/sync_repos.png b/docs/images/coveralls/sync_repos.png deleted file mode 100644 index b3c910a8be6..00000000000 Binary files a/docs/images/coveralls/sync_repos.png and /dev/null differ diff --git a/docs/images/damithc.jpg b/docs/images/damithc.jpg deleted file mode 100644 index 12754388389..00000000000 Binary files a/docs/images/damithc.jpg and /dev/null differ diff --git a/docs/images/dashboard/all_tasks.png b/docs/images/dashboard/all_tasks.png new file mode 100644 index 00000000000..8186aabebab Binary files /dev/null and b/docs/images/dashboard/all_tasks.png differ diff --git a/docs/images/dashboard/dashboard_0.png b/docs/images/dashboard/dashboard_0.png new file mode 100644 index 00000000000..b4b1c9e9eef Binary files /dev/null and b/docs/images/dashboard/dashboard_0.png differ diff --git a/docs/images/dashboard/dashboard_1.png b/docs/images/dashboard/dashboard_1.png new file mode 100644 index 00000000000..cfeffba9812 Binary files /dev/null and b/docs/images/dashboard/dashboard_1.png differ diff --git a/docs/images/dashboard/dashboard_2.png b/docs/images/dashboard/dashboard_2.png new file mode 100644 index 00000000000..c7a3f27cc8f Binary files /dev/null and b/docs/images/dashboard/dashboard_2.png differ diff --git a/docs/images/dashboard/dashboard_3.png b/docs/images/dashboard/dashboard_3.png new file mode 100644 index 00000000000..c903ec84495 Binary files /dev/null and b/docs/images/dashboard/dashboard_3.png differ diff --git a/docs/images/dashboard/dashboard_4.png b/docs/images/dashboard/dashboard_4.png new file mode 100644 index 00000000000..91af9a7e3a1 Binary files /dev/null and b/docs/images/dashboard/dashboard_4.png differ diff --git a/docs/images/dashboard/due_soon.png b/docs/images/dashboard/due_soon.png new file mode 100644 index 00000000000..22204e39874 Binary files /dev/null and b/docs/images/dashboard/due_soon.png differ diff --git a/docs/images/dashboard/nav_bar.png b/docs/images/dashboard/nav_bar.png new file mode 100644 index 00000000000..c6e7f838c9b Binary files /dev/null and b/docs/images/dashboard/nav_bar.png differ diff --git a/docs/images/dashboard/prompt_box.png b/docs/images/dashboard/prompt_box.png new file mode 100644 index 00000000000..05f9a50a985 Binary files /dev/null and b/docs/images/dashboard/prompt_box.png differ diff --git a/docs/images/duesoon/due_soon.png b/docs/images/duesoon/due_soon.png new file mode 100644 index 00000000000..4e545959ac8 Binary files /dev/null and b/docs/images/duesoon/due_soon.png differ diff --git a/docs/images/duesoon/due_soon_sort.png b/docs/images/duesoon/due_soon_sort.png new file mode 100644 index 00000000000..4e98a26a945 Binary files /dev/null and b/docs/images/duesoon/due_soon_sort.png differ diff --git a/docs/images/duesoon/due_soon_tag.png b/docs/images/duesoon/due_soon_tag.png new file mode 100644 index 00000000000..59c0c8cb0ab Binary files /dev/null and b/docs/images/duesoon/due_soon_tag.png differ diff --git a/docs/images/duplicate/addDuplicate.png b/docs/images/duplicate/addDuplicate.png new file mode 100644 index 00000000000..685764d3695 Binary files /dev/null and b/docs/images/duplicate/addDuplicate.png differ diff --git a/docs/images/duplicate/addDuplicate1.png b/docs/images/duplicate/addDuplicate1.png new file mode 100644 index 00000000000..df2acc94a9c Binary files /dev/null and b/docs/images/duplicate/addDuplicate1.png differ diff --git a/docs/images/duplicate/addDuplicate2.png b/docs/images/duplicate/addDuplicate2.png new file mode 100644 index 00000000000..5f3fc1b7756 Binary files /dev/null and b/docs/images/duplicate/addDuplicate2.png differ diff --git a/docs/images/gx-huang.png b/docs/images/gx-huang.png new file mode 100644 index 00000000000..0eca3a3bc57 Binary files /dev/null and b/docs/images/gx-huang.png differ diff --git a/docs/images/lejolly.jpg b/docs/images/lejolly.jpg deleted file mode 100644 index 2d1d94e0cf5..00000000000 Binary files a/docs/images/lejolly.jpg and /dev/null differ diff --git a/docs/images/m133225.jpg b/docs/images/m133225.jpg deleted file mode 100644 index fd14fb94593..00000000000 Binary files a/docs/images/m133225.jpg and /dev/null differ diff --git a/docs/images/module/module_create_code.png b/docs/images/module/module_create_code.png new file mode 100644 index 00000000000..eefe8e7f69b Binary files /dev/null and b/docs/images/module/module_create_code.png differ diff --git a/docs/images/module/module_create_confirm.png b/docs/images/module/module_create_confirm.png new file mode 100644 index 00000000000..88ed08ba322 Binary files /dev/null and b/docs/images/module/module_create_confirm.png differ diff --git a/docs/images/module/module_create_name.png b/docs/images/module/module_create_name.png new file mode 100644 index 00000000000..a31b13d05f3 Binary files /dev/null and b/docs/images/module/module_create_name.png differ diff --git a/docs/images/module/module_create_result.png b/docs/images/module/module_create_result.png new file mode 100644 index 00000000000..1fb10dce0f5 Binary files /dev/null and b/docs/images/module/module_create_result.png differ diff --git a/docs/images/module/module_delete_after.png b/docs/images/module/module_delete_after.png new file mode 100644 index 00000000000..a353640eecc Binary files /dev/null and b/docs/images/module/module_delete_after.png differ diff --git a/docs/images/module/module_delete_before.png b/docs/images/module/module_delete_before.png new file mode 100644 index 00000000000..88f8072dda8 Binary files /dev/null and b/docs/images/module/module_delete_before.png differ diff --git a/docs/images/module/module_edit_code.png b/docs/images/module/module_edit_code.png new file mode 100644 index 00000000000..e03abd7f121 Binary files /dev/null and b/docs/images/module/module_edit_code.png differ diff --git a/docs/images/module/module_edit_code_result.png b/docs/images/module/module_edit_code_result.png new file mode 100644 index 00000000000..9037da25458 Binary files /dev/null and b/docs/images/module/module_edit_code_result.png differ diff --git a/docs/images/module/module_edit_name_result.png b/docs/images/module/module_edit_name_result.png new file mode 100644 index 00000000000..6e056d7809e Binary files /dev/null and b/docs/images/module/module_edit_name_result.png differ diff --git a/docs/images/module/module_edit_option.png b/docs/images/module/module_edit_option.png new file mode 100644 index 00000000000..ef2bd7c81b7 Binary files /dev/null and b/docs/images/module/module_edit_option.png differ diff --git a/docs/images/module/module_main_nav.png b/docs/images/module/module_main_nav.png new file mode 100644 index 00000000000..e4e0ea4292d Binary files /dev/null and b/docs/images/module/module_main_nav.png differ diff --git a/docs/images/module/module_nav.png b/docs/images/module/module_nav.png new file mode 100644 index 00000000000..6732f2fb808 Binary files /dev/null and b/docs/images/module/module_nav.png differ diff --git a/docs/images/module/module_nav_create.png b/docs/images/module/module_nav_create.png new file mode 100644 index 00000000000..832eb094728 Binary files /dev/null and b/docs/images/module/module_nav_create.png differ diff --git a/docs/images/module/module_nav_edit.png b/docs/images/module/module_nav_edit.png new file mode 100644 index 00000000000..22361796cbb Binary files /dev/null and b/docs/images/module/module_nav_edit.png differ diff --git a/docs/images/module/module_show.png b/docs/images/module/module_show.png new file mode 100644 index 00000000000..f179868d70c Binary files /dev/null and b/docs/images/module/module_show.png differ diff --git a/docs/images/module/module_tab_1.png b/docs/images/module/module_tab_1.png new file mode 100644 index 00000000000..12dd962a9c1 Binary files /dev/null and b/docs/images/module/module_tab_1.png differ diff --git a/docs/images/module/module_tab_2.png b/docs/images/module/module_tab_2.png new file mode 100644 index 00000000000..ba939078564 Binary files /dev/null and b/docs/images/module/module_tab_2.png differ diff --git a/docs/images/module/module_tab_3.png b/docs/images/module/module_tab_3.png new file mode 100644 index 00000000000..c9e8f04bdae Binary files /dev/null and b/docs/images/module/module_tab_3.png differ diff --git a/docs/images/module/modules_show_module.png b/docs/images/module/modules_show_module.png new file mode 100644 index 00000000000..6175aa5963e Binary files /dev/null and b/docs/images/module/modules_show_module.png differ diff --git a/docs/images/netlify/UiClassDiagram.png b/docs/images/netlify/UiClassDiagram.png new file mode 100644 index 00000000000..2b250bf4521 Binary files /dev/null and b/docs/images/netlify/UiClassDiagram.png differ diff --git a/docs/images/productivity/daily_tab.png b/docs/images/productivity/daily_tab.png new file mode 100644 index 00000000000..a146fff2d52 Binary files /dev/null and b/docs/images/productivity/daily_tab.png differ diff --git a/docs/images/productivity/goal1.png b/docs/images/productivity/goal1.png new file mode 100644 index 00000000000..7ae7e8bfedd Binary files /dev/null and b/docs/images/productivity/goal1.png differ diff --git a/docs/images/productivity/goal2.png b/docs/images/productivity/goal2.png new file mode 100644 index 00000000000..a483193633d Binary files /dev/null and b/docs/images/productivity/goal2.png differ diff --git a/docs/images/productivity/points-tab.png b/docs/images/productivity/points-tab.png new file mode 100644 index 00000000000..84f5a016a8d Binary files /dev/null and b/docs/images/productivity/points-tab.png differ diff --git a/docs/images/productivity/weekly_tab.png b/docs/images/productivity/weekly_tab.png new file mode 100644 index 00000000000..f8c87d3b9be Binary files /dev/null and b/docs/images/productivity/weekly_tab.png differ diff --git a/docs/images/remove/$address.png b/docs/images/remove/$address.png deleted file mode 100644 index cf0434e0e83..00000000000 Binary files a/docs/images/remove/$address.png and /dev/null differ diff --git a/docs/images/remove/SafeDeleteConflicts.png b/docs/images/remove/SafeDeleteConflicts.png deleted file mode 100644 index 8f0abeffd4d..00000000000 Binary files a/docs/images/remove/SafeDeleteConflicts.png and /dev/null differ diff --git a/docs/images/remove/UnsafeDelete.png b/docs/images/remove/UnsafeDelete.png deleted file mode 100644 index 9e376d02a0c..00000000000 Binary files a/docs/images/remove/UnsafeDelete.png and /dev/null differ diff --git a/docs/images/remove/UnsafeDeleteOnField.png b/docs/images/remove/UnsafeDeleteOnField.png deleted file mode 100644 index 44d5bb0a442..00000000000 Binary files a/docs/images/remove/UnsafeDeleteOnField.png and /dev/null differ diff --git a/docs/images/souwmyaa.png b/docs/images/souwmyaa.png new file mode 100644 index 00000000000..06aefadcf75 Binary files /dev/null and b/docs/images/souwmyaa.png differ diff --git a/docs/images/stats/stats_area.png b/docs/images/stats/stats_area.png new file mode 100644 index 00000000000..357bf530315 Binary files /dev/null and b/docs/images/stats/stats_area.png differ diff --git a/docs/images/stats/stats_area_click_area.png b/docs/images/stats/stats_area_click_area.png new file mode 100644 index 00000000000..31879de54d9 Binary files /dev/null and b/docs/images/stats/stats_area_click_area.png differ diff --git a/docs/images/stats/stats_area_click_point.png b/docs/images/stats/stats_area_click_point.png new file mode 100644 index 00000000000..1371aae2297 Binary files /dev/null and b/docs/images/stats/stats_area_click_point.png differ diff --git a/docs/images/stats/stats_bar.png b/docs/images/stats/stats_bar.png new file mode 100644 index 00000000000..49fa3726e6d Binary files /dev/null and b/docs/images/stats/stats_bar.png differ diff --git a/docs/images/stats/stats_bar_click.png b/docs/images/stats/stats_bar_click.png new file mode 100644 index 00000000000..b3bfcad385b Binary files /dev/null and b/docs/images/stats/stats_bar_click.png differ diff --git a/docs/images/stats/stats_click_point.png b/docs/images/stats/stats_click_point.png new file mode 100644 index 00000000000..ae662058c33 Binary files /dev/null and b/docs/images/stats/stats_click_point.png differ diff --git a/docs/images/stats/stats_nav.png b/docs/images/stats/stats_nav.png new file mode 100644 index 00000000000..b964dd673f7 Binary files /dev/null and b/docs/images/stats/stats_nav.png differ diff --git a/docs/images/stats/stats_pie.png b/docs/images/stats/stats_pie.png new file mode 100644 index 00000000000..d86f5319aac Binary files /dev/null and b/docs/images/stats/stats_pie.png differ diff --git a/docs/images/stats/stats_pie_click.png b/docs/images/stats/stats_pie_click.png new file mode 100644 index 00000000000..92a35644dd5 Binary files /dev/null and b/docs/images/stats/stats_pie_click.png differ diff --git a/docs/images/stats/stats_ui.png b/docs/images/stats/stats_ui.png new file mode 100644 index 00000000000..e14dbe01443 Binary files /dev/null and b/docs/images/stats/stats_ui.png differ diff --git a/docs/images/teikjun.png b/docs/images/teikjun.png new file mode 100644 index 00000000000..380f9195a4c Binary files /dev/null and b/docs/images/teikjun.png differ diff --git a/docs/images/tracing/DebuggerStep1.png b/docs/images/tracing/DebuggerStep1.png deleted file mode 100644 index 6d088ae63de..00000000000 Binary files a/docs/images/tracing/DebuggerStep1.png and /dev/null differ diff --git a/docs/images/tracing/EditCommand.png b/docs/images/tracing/EditCommand.png deleted file mode 100644 index ed34ad08b98..00000000000 Binary files a/docs/images/tracing/EditCommand.png and /dev/null differ diff --git a/docs/images/tracing/Execute.png b/docs/images/tracing/Execute.png deleted file mode 100644 index 66b7044e207..00000000000 Binary files a/docs/images/tracing/Execute.png and /dev/null differ diff --git a/docs/images/tracing/FindUsages.png b/docs/images/tracing/FindUsages.png deleted file mode 100644 index 16f94a53d09..00000000000 Binary files a/docs/images/tracing/FindUsages.png and /dev/null differ diff --git a/docs/images/tracing/LeftGutter.png b/docs/images/tracing/LeftGutter.png deleted file mode 100644 index 571acf99e7b..00000000000 Binary files a/docs/images/tracing/LeftGutter.png and /dev/null differ diff --git a/docs/images/tracing/LogicSequenceDiagram.png b/docs/images/tracing/LogicSequenceDiagram.png deleted file mode 100644 index c9b1f6cc232..00000000000 Binary files a/docs/images/tracing/LogicSequenceDiagram.png and /dev/null differ diff --git a/docs/images/tracing/ShowExecutionPoint.png b/docs/images/tracing/ShowExecutionPoint.png deleted file mode 100644 index ea72176fa64..00000000000 Binary files a/docs/images/tracing/ShowExecutionPoint.png and /dev/null differ diff --git a/docs/images/tracing/StepInto.png b/docs/images/tracing/StepInto.png deleted file mode 100644 index ddfa0e2aeb8..00000000000 Binary files a/docs/images/tracing/StepInto.png and /dev/null differ diff --git a/docs/images/tracing/StepOver.png b/docs/images/tracing/StepOver.png deleted file mode 100644 index ed5fb276e29..00000000000 Binary files a/docs/images/tracing/StepOver.png and /dev/null differ diff --git a/docs/images/tracing/StructureToolWindow.png b/docs/images/tracing/StructureToolWindow.png deleted file mode 100644 index c377c331d5f..00000000000 Binary files a/docs/images/tracing/StructureToolWindow.png and /dev/null differ diff --git a/docs/images/tracing/Variables.png b/docs/images/tracing/Variables.png deleted file mode 100644 index 02ea7b15520..00000000000 Binary files a/docs/images/tracing/Variables.png and /dev/null differ diff --git a/docs/images/wyt-sonia.png b/docs/images/wyt-sonia.png new file mode 100644 index 00000000000..870238de6a6 Binary files /dev/null and b/docs/images/wyt-sonia.png differ diff --git a/docs/images/yijinl.jpg b/docs/images/yijinl.jpg deleted file mode 100644 index adbf62ad940..00000000000 Binary files a/docs/images/yijinl.jpg and /dev/null differ diff --git a/docs/images/yl_coder.jpg b/docs/images/yl_coder.jpg deleted file mode 100644 index 17b48a73227..00000000000 Binary files a/docs/images/yl_coder.jpg and /dev/null differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000000..cb29b1ef11a --- /dev/null +++ b/docs/index.html @@ -0,0 +1,2269 @@ + + + + + + + + StudyBuddy + + + + + +
+
+

Introduction

+
+
+

Build Status

+
+
+
+ Ui +
+
Figure 1. UI Sample Picture, will be updated in ther future
+
+
+

What is StudyBuddy ?

+
+
    +
  • +

    StudyBuddy is a task keeper for students who wish to manage their time more + efficiently.

    +
  • +
  • +

    With the help of StudyBuddy, students can easily manage and view their school tasks.

    +
  • +
  • +

    Sort, filter and search commands are also provided to make the interaction more + meaningful.

    +
  • +
  • +

    It also provides services to show the statistics for time, grades breakdown and workload + comparison between different + modules in Pie charts. With this visualisation of data, students can be more aware of + their time management.

    +
  • +
+
+
+
+

Who can benefit most from StudyBuddy ?

+
+
    +
  • +

    It is designed for students who are able to type fast and comfortable with Command-Line + Interface(CLI).

    +
  • +
+
+
+
+

What is CLI?

+
+
    +
  • +

    CLI is a command line program that accepts text input to execute operating system + functions.

    +
  • +
  • +

    Compare with graphical user interfaces(GUI), CLI performs interaction with user by + keyboard input instead of + mouse clicking, such as cmd window.

    +
  • +
+
+
+
+
+
+

Site Map

+
+
+

To browse more information, please check our site map:

+
+
+ +
+
+
+
+

Acknowledgements

+
+
+ +
+
+
+
+

Licence : MIT

+
+ +
+
+
+ + + diff --git a/docs/stylesheets/asciidoctor.css b/docs/stylesheets/asciidoctor.css index 36590bf346c..a18d785b460 100644 --- a/docs/stylesheets/asciidoctor.css +++ b/docs/stylesheets/asciidoctor.css @@ -1,407 +1,2031 @@ /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */ /* Remove comment around @import statement below when using as a custom stylesheet */ /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/ -article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block} -audio,canvas,video{display:inline-block} -audio:not([controls]){display:none;height:0} -[hidden],template{display:none} -script{display:none!important} -html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%} -body{margin:0} -a{background:transparent} -a:focus{outline:thin dotted} -a:active,a:hover{outline:0} -h1{font-size:2em;margin:.67em 0} -abbr[title]{border-bottom:1px dotted} -b,strong{font-weight:bold} -dfn{font-style:italic} -hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0} -mark{background:#ff0;color:#000} -code,kbd,pre,samp{font-family:monospace;font-size:1em} -pre{white-space:pre-wrap} -q{quotes:"\201C" "\201D" "\2018" "\2019"} -small{font-size:80%} -sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} -sup{top:-.5em} -sub{bottom:-.25em} -img{border:0} -svg:not(:root){overflow:hidden} -figure{margin:0} -fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} -legend{border:0;padding:0} -button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} -button,input{line-height:normal} -button,select{text-transform:none} -button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} -button[disabled],html input[disabled]{cursor:default} -input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} -input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box} -input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none} -button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} -textarea{overflow:auto;vertical-align:top} -table{border-collapse:collapse;border-spacing:0} -*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} -html,body{font-size:100%} -body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto} -a:hover{cursor:pointer} -img,object,embed{max-width:100%;height:auto} -object,embed{height:100%} -img{-ms-interpolation-mode:bicubic} -.left{float:left!important} -.right{float:right!important} -.text-left{text-align:left!important} -.text-right{text-align:right!important} -.text-center{text-align:center!important} -.text-justify{text-align:justify!important} -.hide{display:none} -body{-webkit-font-smoothing:antialiased} -img,object,svg{display:inline-block;vertical-align:middle} -textarea{height:auto;min-height:50px} -select{width:100%} -.center{margin-left:auto;margin-right:auto} -.spread{width:100%} -p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6} -.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} -div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr} -a{color:#2156a5;text-decoration:underline;line-height:inherit} -a:hover,a:focus{color:#1d4b8f} -a img{border:none} -p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} -p aside{font-size:.875em;line-height:1.35;font-style:italic} -h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} -h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} -h1{font-size:2.125em} -h2{font-size:1.6875em} -h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} -h4,h5{font-size:1.125em} -h6{font-size:1em} -hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0} -em,i{font-style:italic;line-height:inherit} -strong,b{font-weight:bold;line-height:inherit} -small{font-size:60%;line-height:inherit} -code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} -ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} -ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em} -ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em} -ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} -ul.square{list-style-type:square} -ul.circle{list-style-type:circle} -ul.disc{list-style-type:disc} -ul.no-bullet{list-style:none} -ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} -dl dt{margin-bottom:.3125em;font-weight:bold} -dl dd{margin-bottom:1.25em} -abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help} -abbr{text-transform:none} -blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} -blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)} -blockquote cite:before{content:"\2014 \0020"} -blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)} -blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} -@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} -h1{font-size:2.75em} -h2{font-size:2.3125em} -h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} -h4{font-size:1.4375em}} -table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede} -table thead,table tfoot{background:#f7f8f7;font-weight:bold} -table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} -table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} -table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7} -table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6} -body{tab-size:4} -h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} -h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} -.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table} -.clearfix:after,.float-group:after{clear:both} -*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed} -pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed} -.keyseq{color:rgba(51,51,51,.8)} -kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} -.keyseq kbd:first-child{margin-left:0} -.keyseq kbd:last-child{margin-right:0} -.menuseq,.menu{color:rgba(0,0,0,.8)} -b.button:before,b.button:after{position:relative;top:-1px;font-weight:400} -b.button:before{content:"[";padding:0 3px 0 2px} -b.button:after{content:"]";padding:0 2px 0 3px} -p a>code:hover{color:rgba(0,0,0,.9)} -#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} -#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table} -#header:after,#content:after,#footnotes:after,#footer:after{clear:both} -#content{margin-top:1.25em} -#content:before{content:none} -#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} -#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8} -#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px} -#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap} -#header .details span:first-child{margin-left:-.125em} -#header .details span.email a{color:rgba(0,0,0,.85)} -#header .details br{display:none} -#header .details br+span:before{content:"\00a0\2013\00a0"} -#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} -#header .details br+span#revremark:before{content:"\00a0|\00a0"} -#header #revnumber{text-transform:capitalize} -#header #revnumber:after{content:"\00a0"} -#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} -#toc{border-bottom:1px solid #efefed;padding-bottom:.5em} -#toc>ul{margin-left:.125em} -#toc ul.sectlevel0>li>a{font-style:italic} -#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} -#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} -#toc li{line-height:1.3334;margin-top:.3334em} -#toc a{text-decoration:none} -#toc a:active{text-decoration:underline} -#toctitle{color:#7a2518;font-size:1.2em} -@media only screen and (min-width:768px){#toctitle{font-size:1.375em} -body.toc2{padding-left:15em;padding-right:0} -#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} -#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} -#toc.toc2>ul{font-size:.9em;margin-bottom:0} -#toc.toc2 ul ul{margin-left:0;padding-left:1em} -#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} -body.toc2.toc-right{padding-left:0;padding-right:15em} -body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}} -@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} -#toc.toc2{width:20em} -#toc.toc2 #toctitle{font-size:1.375em} -#toc.toc2>ul{font-size:.95em} -#toc.toc2 ul ul{padding-left:1.25em} -body.toc2.toc-right{padding-left:0;padding-right:20em}} -#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} -#content #toc>:first-child{margin-top:0} -#content #toc>:last-child{margin-bottom:0} -#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em} -#footer-text{color:rgba(255,255,255,.8);line-height:1.44} -.sect1{padding-bottom:.625em} -@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}} -.sect1+.sect1{border-top:1px solid #efefed} -#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} -#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} -#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} -#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} -#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} -.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} -.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} -table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0} -.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)} -table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit} -.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} -.admonitionblock>table td.icon{text-align:center;width:80px} -.admonitionblock>table td.icon img{max-width:none} -.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} -.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)} -.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} -.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px} -.exampleblock>.content>:first-child{margin-top:0} -.exampleblock>.content>:last-child{margin-bottom:0} -.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} -.sidebarblock>:first-child{margin-top:0} -.sidebarblock>:last-child{margin-bottom:0} -.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} -.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} -.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8} -.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1} -.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em} -.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal} -@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}} -@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}} -.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)} -.listingblock pre.highlightjs{padding:0} -.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px} -.listingblock pre.prettyprint{border-width:0} -.listingblock>.content{position:relative} -.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999} -.listingblock:hover code[data-lang]:before{display:block} -.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999} -.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"} -table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none} -table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45} -table.pyhltable td.code{padding-left:.75em;padding-right:0} -pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8} -pre.pygments .lineno{display:inline-block;margin-right:.25em} -table.pyhltable .linenodiv{background:none!important;padding-right:0!important} -.quoteblock{margin:0 1em 1.25em 1.5em;display:table} -.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em} -.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} -.quoteblock blockquote{margin:0;padding:0;border:0} -.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} -.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} -.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right} -.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)} -.quoteblock .quoteblock blockquote{padding:0 0 0 .75em} -.quoteblock .quoteblock blockquote:before{display:none} -.verseblock{margin:0 1em 1.25em 1em} -.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} -.verseblock pre strong{font-weight:400} -.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} -.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} -.quoteblock .attribution br,.verseblock .attribution br{display:none} -.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} -.quoteblock.abstract{margin:0 0 1.25em 0;display:block} -.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0} -.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none} -table.tableblock{max-width:100%;border-collapse:separate} -table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0} -table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} -table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0} -table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0} -table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0} -table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0} -table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0} -table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0} -table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0} -table.frame-all{border-width:1px} -table.frame-sides{border-width:0 1px} -table.frame-topbot{border-width:1px 0} -th.halign-left,td.halign-left{text-align:left} -th.halign-right,td.halign-right{text-align:right} -th.halign-center,td.halign-center{text-align:center} -th.valign-top,td.valign-top{vertical-align:top} -th.valign-bottom,td.valign-bottom{vertical-align:bottom} -th.valign-middle,td.valign-middle{vertical-align:middle} -table thead th,table tfoot th{font-weight:bold} -tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7} -tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} -p.tableblock>code:only-child{background:none;padding:0} -p.tableblock{font-size:1em} -td>div.verse{white-space:pre} -ol{margin-left:1.75em} -ul li ol{margin-left:1.5em} -dl dd{margin-left:1.125em} -dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} -ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} -ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none} -ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em} -ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em} -ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px} -ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden} -ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block} -ul.inline>li>*{display:block} -.unstyled dl dt{font-weight:400;font-style:normal} -ol.arabic{list-style-type:decimal} -ol.decimal{list-style-type:decimal-leading-zero} -ol.loweralpha{list-style-type:lower-alpha} -ol.upperalpha{list-style-type:upper-alpha} -ol.lowerroman{list-style-type:lower-roman} -ol.upperroman{list-style-type:upper-roman} -ol.lowergreek{list-style-type:lower-greek} -.hdlist>table,.colist>table{border:0;background:none} -.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} -td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} -td.hdlist1{font-weight:bold;padding-bottom:1.25em} -.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} -.colist>table tr>td:first-of-type{padding:0 .75em;line-height:1} -.colist>table tr>td:last-of-type{padding:.25em 0} -.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd} -.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0} -.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em} -.imageblock>.title{margin-bottom:0} -.imageblock.thumb,.imageblock.th{border-width:6px} -.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} -.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} -.image.left{margin-right:.625em} -.image.right{margin-left:.625em} -a.image{text-decoration:none;display:inline-block} -a.image object{pointer-events:none} -sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} -sup.footnote a,sup.footnoteref a{text-decoration:none} -sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} -#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} -#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0} -#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em} -#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none} -#footnotes .footnote:last-of-type{margin-bottom:0} -#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} -.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} -.gist .file-data>table td.line-data{width:99%} -div.unbreakable{page-break-inside:avoid} -.big{font-size:larger} -.small{font-size:smaller} -.underline{text-decoration:underline} -.overline{text-decoration:overline} -.line-through{text-decoration:line-through} -.aqua{color:#00bfbf} -.aqua-background{background-color:#00fafa} -.black{color:#000} -.black-background{background-color:#000} -.blue{color:#0000bf} -.blue-background{background-color:#0000fa} -.fuchsia{color:#bf00bf} -.fuchsia-background{background-color:#fa00fa} -.gray{color:#606060} -.gray-background{background-color:#7d7d7d} -.green{color:#006000} -.green-background{background-color:#007d00} -.lime{color:#00bf00} -.lime-background{background-color:#00fa00} -.maroon{color:#600000} -.maroon-background{background-color:#7d0000} -.navy{color:#000060} -.navy-background{background-color:#00007d} -.olive{color:#606000} -.olive-background{background-color:#7d7d00} -.purple{color:#600060} -.purple-background{background-color:#7d007d} -.red{color:#bf0000} -.red-background{background-color:#fa0000} -.silver{color:#909090} -.silver-background{background-color:#bcbcbc} -.teal{color:#006060} -.teal-background{background-color:#007d7d} -.white{color:#bfbfbf} -.white-background{background-color:#fafafa} -.yellow{color:#bfbf00} -.yellow-background{background-color:#fafa00} -span.icon>.fa{cursor:default} -.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} -.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c} -.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} -.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900} -.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400} -.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000} -.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} -.conum[data-value] *{color:#fff!important} -.conum[data-value]+b{display:none} -.conum[data-value]:after{content:attr(data-value)} -pre .conum[data-value]{position:relative;top:-.125em} -b.conum *{color:inherit!important} -.conum:not([data-value]):empty{display:none} -dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} -h1,h2,p,td.content,span.alt{letter-spacing:-.01em} -p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} -p,blockquote,dt,td.content,span.alt{font-size:1.0625rem} -p{margin-bottom:1.25rem} -.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} -.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc} -.print-only{display:none!important} -@media print{@page{margin:1.25cm .75cm} -*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important} -a{color:inherit!important;text-decoration:underline!important} -a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} -a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} -abbr[title]:after{content:" (" attr(title) ")"} -pre,blockquote,tr,img,object,svg{page-break-inside:avoid} -thead{display:table-header-group} -svg{max-width:100%} -p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} -h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} -#toc,.sidebarblock,.exampleblock>.content{background:none!important} -#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important} -.sect1{padding-bottom:0!important} -.sect1+.sect1{border:0!important} -#header>h1:first-child{margin-top:1.25rem} -body.book #header{text-align:center} -body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0} -body.book #header .details{border:0!important;display:block;padding:0!important} -body.book #header .details span:first-child{margin-left:0!important} -body.book #header .details br{display:block} -body.book #header .details br+span:before{content:none!important} -body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} -body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} -.listingblock code[data-lang]:before{display:block} -#footer{background:none!important;padding:0 .9375em} -#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em} -.hide-on-print{display:none!important} -.print-only{display:block!important} -.hide-for-print{display:none!important} -.show-for-print{display:inherit!important}} +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block +} + +audio, canvas, video { + display: inline-block +} + +audio:not([controls]) { + display: none; + height: 0 +} + +[hidden], template { + display: none +} + +script { + display: none !important +} + +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +a { + background: transparent +} + +a:focus { + outline: thin dotted +} + +a:active, a:hover { + outline: 0 +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, strong { + font-weight: bold +} + +dfn { + font-style: italic +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0 +} + +mark { + background: #ff0; + color: #000 +} + +code, kbd, pre, samp { + font-family: monospace; + font-size: 1em +} + +pre { + white-space: pre-wrap +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019" +} + +small { + font-size: 80% +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sup { + top: -.5em +} + +sub { + bottom: -.25em +} + +img { + border: 0 +} + +svg:not(:root) { + overflow: hidden +} + +figure { + margin: 0 +} + +fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: .35em .625em .75em +} + +legend { + border: 0; + padding: 0 +} + +button, input, select, textarea { + font-family: inherit; + font-size: 100%; + margin: 0 +} + +button, input { + line-height: normal +} + +button, select { + text-transform: none +} + +button, html input[type="button"], input[type="reset"], input[type="submit"] { + -webkit-appearance: button; + cursor: pointer +} + +button[disabled], html input[disabled] { + cursor: default +} + +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; + padding: 0 +} + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box +} + +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0 +} + +textarea { + overflow: auto; + vertical-align: top +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +*, *:before, *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +html, body { + font-size: 100% +} + +body { + background: #fff; + color: rgba(0, 0, 0, .8); + padding: 0; + margin: 0; + font-family: "Noto Serif", "DejaVu Serif", serif; + font-weight: 400; + font-style: normal; + line-height: 1; + position: relative; + cursor: auto +} + +a:hover { + cursor: pointer +} + +img, object, embed { + max-width: 100%; + height: auto +} + +object, embed { + height: 100% +} + +img { + -ms-interpolation-mode: bicubic +} + +.left { + float: left !important +} + +.right { + float: right !important +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +.text-justify { + text-align: justify !important +} + +.hide { + display: none +} + +body { + -webkit-font-smoothing: antialiased +} + +img, object, svg { + display: inline-block; + vertical-align: middle +} + +textarea { + height: auto; + min-height: 50px +} + +select { + width: 100% +} + +.center { + margin-left: auto; + margin-right: auto +} + +.spread { + width: 100% +} + +p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { + font-size: 1.21875em; + line-height: 1.6 +} + +.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { + line-height: 1.45; + color: #7a2518; + font-weight: 400; + margin-top: 0; + margin-bottom: .25em +} + +div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { + margin: 0; + padding: 0; + direction: ltr +} + +a { + color: #2156a5; + text-decoration: underline; + line-height: inherit +} + +a:hover, a:focus { + color: #1d4b8f +} + +a img { + border: none +} + +p { + font-family: inherit; + font-weight: 400; + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + text-rendering: optimizeLegibility +} + +p aside { + font-size: .875em; + line-height: 1.35; + font-style: italic +} + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + font-family: "Open Sans", "DejaVu Sans", sans-serif; + font-weight: 300; + font-style: normal; + color: #ba3925; + text-rendering: optimizeLegibility; + margin-top: 1em; + margin-bottom: .5em; + line-height: 1.0125em +} + +h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { + font-size: 60%; + color: #e99b8f; + line-height: 0 +} + +h1 { + font-size: 2.125em +} + +h2 { + font-size: 1.6875em +} + +h3, #toctitle, .sidebarblock > .content > .title { + font-size: 1.375em +} + +h4, h5 { + font-size: 1.125em +} + +h6 { + font-size: 1em +} + +hr { + border: solid #ddddd8; + border-width: 1px 0 0; + clear: both; + margin: 1.25em 0 1.1875em; + height: 0 +} + +em, i { + font-style: italic; + line-height: inherit +} + +strong, b { + font-weight: bold; + line-height: inherit +} + +small { + font-size: 60%; + line-height: inherit +} + +code { + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + font-weight: 400; + color: rgba(0, 0, 0, .9) +} + +ul, ol, dl { + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + list-style-position: outside; + font-family: inherit +} + +ul, ol, ul.no-bullet, ol.no-bullet { + margin-left: 1.5em +} + +ul li ul, ul li ol { + margin-left: 1.25em; + margin-bottom: 0; + font-size: 1em +} + +ul.square li ul, ul.circle li ul, ul.disc li ul { + list-style: inherit +} + +ul.square { + list-style-type: square +} + +ul.circle { + list-style-type: circle +} + +ul.disc { + list-style-type: disc +} + +ul.no-bullet { + list-style: none +} + +ol li ul, ol li ol { + margin-left: 1.25em; + margin-bottom: 0 +} + +dl dt { + margin-bottom: .3125em; + font-weight: bold +} + +dl dd { + margin-bottom: 1.25em +} + +abbr, acronym { + text-transform: uppercase; + font-size: 90%; + color: rgba(0, 0, 0, .8); + border-bottom: 1px dotted #ddd; + cursor: help +} + +abbr { + text-transform: none +} + +blockquote { + margin: 0 0 1.25em; + padding: .5625em 1.25em 0 1.1875em; + border-left: 1px solid #ddd +} + +blockquote cite { + display: block; + font-size: .9375em; + color: rgba(0, 0, 0, .6) +} + +blockquote cite:before { + content: "\2014 \0020" +} + +blockquote cite a, blockquote cite a:visited { + color: rgba(0, 0, 0, .6) +} + +blockquote, blockquote p { + line-height: 1.6; + color: rgba(0, 0, 0, .85) +} + +@media only screen and (min-width: 768px) { + h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + line-height: 1.2 + } + + h1 { + font-size: 2.75em + } + + h2 { + font-size: 2.3125em + } + + h3, #toctitle, .sidebarblock > .content > .title { + font-size: 1.6875em + } + + h4 { + font-size: 1.4375em + } +} + +table { + background: #fff; + margin-bottom: 1.25em; + border: solid 1px #dedede +} + +table thead, table tfoot { + background: #f7f8f7; + font-weight: bold +} + +table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { + padding: .5em .625em .625em; + font-size: inherit; + color: rgba(0, 0, 0, .8); + text-align: left +} + +table tr th, table tr td { + padding: .5625em .625em; + font-size: inherit; + color: rgba(0, 0, 0, .8) +} + +table tr.even, table tr.alt, table tr:nth-of-type(even) { + background: #f8f8f7 +} + +table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { + display: table-cell; + line-height: 1.6 +} + +body { + tab-size: 4 +} + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { + line-height: 1.2; + word-spacing: -.05em +} + +h1 strong, h2 strong, h3 strong, #toctitle strong, .sidebarblock > .content > .title strong, h4 strong, h5 strong, h6 strong { + font-weight: 400 +} + +.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { + content: " "; + display: table +} + +.clearfix:after, .float-group:after { + clear: both +} + +*:not(pre) > code { + font-size: .9375em; + font-style: normal !important; + letter-spacing: 0; + padding: .1em .5ex; + word-spacing: -.15em; + background-color: #f7f7f8; + -webkit-border-radius: 4px; + border-radius: 4px; + line-height: 1.45; + text-rendering: optimizeSpeed +} + +pre, pre > code { + line-height: 1.45; + color: rgba(0, 0, 0, .9); + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + font-weight: 400; + text-rendering: optimizeSpeed +} + +.keyseq { + color: rgba(51, 51, 51, .8) +} + +kbd { + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + display: inline-block; + color: rgba(0, 0, 0, .8); + font-size: .65em; + line-height: 1.45; + background-color: #f7f7f7; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em white inset; + box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset; + margin: 0 .15em; + padding: .2em .5em; + vertical-align: middle; + position: relative; + top: -.1em; + white-space: nowrap +} + +.keyseq kbd:first-child { + margin-left: 0 +} + +.keyseq kbd:last-child { + margin-right: 0 +} + +.menuseq, .menu { + color: rgba(0, 0, 0, .8) +} + +b.button:before, b.button:after { + position: relative; + top: -1px; + font-weight: 400 +} + +b.button:before { + content: "["; + padding: 0 3px 0 2px +} + +b.button:after { + content: "]"; + padding: 0 2px 0 3px +} + +p a > code:hover { + color: rgba(0, 0, 0, .9) +} + +#header, #content, #footnotes, #footer { + width: 100%; + margin-left: auto; + margin-right: auto; + margin-top: 0; + margin-bottom: 0; + max-width: 62.5em; + *zoom: 1; + position: relative; + padding-left: .9375em; + padding-right: .9375em +} + +#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { + content: " "; + display: table +} + +#header:after, #content:after, #footnotes:after, #footer:after { + clear: both +} + +#content { + margin-top: 1.25em +} + +#content:before { + content: none +} + +#header > h1:first-child { + color: rgba(0, 0, 0, .85); + margin-top: 2.25rem; + margin-bottom: 0 +} + +#header > h1:first-child + #toc { + margin-top: 8px; + border-top: 1px solid #ddddd8 +} + +#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { + border-bottom: 1px solid #ddddd8; + padding-bottom: 8px +} + +#header .details { + border-bottom: 1px solid #ddddd8; + line-height: 1.45; + padding-top: .25em; + padding-bottom: .25em; + padding-left: .25em; + color: rgba(0, 0, 0, .6); + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-flow: row wrap; + -webkit-flex-flow: row wrap; + flex-flow: row wrap +} + +#header .details span:first-child { + margin-left: -.125em +} + +#header .details span.email a { + color: rgba(0, 0, 0, .85) +} + +#header .details br { + display: none +} + +#header .details br + span:before { + content: "\00a0\2013\00a0" +} + +#header .details br + span.author:before { + content: "\00a0\22c5\00a0"; + color: rgba(0, 0, 0, .85) +} + +#header .details br + span#revremark:before { + content: "\00a0|\00a0" +} + +#header #revnumber { + text-transform: capitalize +} + +#header #revnumber:after { + content: "\00a0" +} + +#content > h1:first-child:not([class]) { + color: rgba(0, 0, 0, .85); + border-bottom: 1px solid #ddddd8; + padding-bottom: 8px; + margin-top: 0; + padding-top: 1rem; + margin-bottom: 1.25rem +} + +#toc { + border-bottom: 1px solid #efefed; + padding-bottom: .5em +} + +#toc > ul { + margin-left: .125em +} + +#toc ul.sectlevel0 > li > a { + font-style: italic +} + +#toc ul.sectlevel0 ul.sectlevel1 { + margin: .5em 0 +} + +#toc ul { + font-family: "Open Sans", "DejaVu Sans", sans-serif; + list-style-type: none +} + +#toc li { + line-height: 1.3334; + margin-top: .3334em +} + +#toc a { + text-decoration: none +} + +#toc a:active { + text-decoration: underline +} + +#toctitle { + color: #7a2518; + font-size: 1.2em +} + +@media only screen and (min-width: 768px) { + #toctitle { + font-size: 1.375em + } + + body.toc2 { + padding-left: 15em; + padding-right: 0 + } + + #toc.toc2 { + margin-top: 0 !important; + background-color: #f8f8f7; + position: fixed; + width: 15em; + left: 0; + top: 0; + border-right: 1px solid #efefed; + border-top-width: 0 !important; + border-bottom-width: 0 !important; + z-index: 1000; + padding: 1.25em 1em; + height: 100%; + overflow: auto + } + + #toc.toc2 #toctitle { + margin-top: 0; + margin-bottom: .8rem; + font-size: 1.2em + } + + #toc.toc2 > ul { + font-size: .9em; + margin-bottom: 0 + } + + #toc.toc2 ul ul { + margin-left: 0; + padding-left: 1em + } + + #toc.toc2 ul.sectlevel0 ul.sectlevel1 { + padding-left: 0; + margin-top: .5em; + margin-bottom: .5em + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 15em + } + + body.toc2.toc-right #toc.toc2 { + border-right-width: 0; + border-left: 1px solid #efefed; + left: auto; + right: 0 + } +} + +@media only screen and (min-width: 1280px) { + body.toc2 { + padding-left: 20em; + padding-right: 0 + } + + #toc.toc2 { + width: 20em + } + + #toc.toc2 #toctitle { + font-size: 1.375em + } + + #toc.toc2 > ul { + font-size: .95em + } + + #toc.toc2 ul ul { + padding-left: 1.25em + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 20em + } +} + +#content #toc { + border-style: solid; + border-width: 1px; + border-color: #e0e0dc; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f8f8f7; + -webkit-border-radius: 4px; + border-radius: 4px +} + +#content #toc > :first-child { + margin-top: 0 +} + +#content #toc > :last-child { + margin-bottom: 0 +} + +#footer { + max-width: 100%; + background-color: rgba(0, 0, 0, .8); + padding: 1.25em +} + +#footer-text { + color: rgba(255, 255, 255, .8); + line-height: 1.44 +} + +.sect1 { + padding-bottom: .625em +} + +@media only screen and (min-width: 768px) { + .sect1 { + padding-bottom: 1.25em + } +} + +.sect1 + .sect1 { + border-top: 1px solid #efefed +} + +#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { + position: absolute; + z-index: 1001; + width: 1.5ex; + margin-left: -1.5ex; + display: block; + text-decoration: none !important; + visibility: hidden; + text-align: center; + font-weight: 400 +} + +#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { + content: "\00A7"; + font-size: .85em; + display: block; + padding-top: .1em +} + +#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { + visibility: visible +} + +#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { + color: #ba3925; + text-decoration: none +} + +#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { + color: #a53221 +} + +.audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { + margin-bottom: 1.25em +} + +.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { + text-rendering: optimizeLegibility; + text-align: left; + font-family: "Noto Serif", "DejaVu Serif", serif; + font-size: 1rem; + font-style: italic +} + +table.tableblock > caption.title { + white-space: nowrap; + overflow: visible; + max-width: 0 +} + +.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { + color: rgba(0, 0, 0, .85) +} + +table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { + font-size: inherit +} + +.admonitionblock > table { + border-collapse: separate; + border: 0; + background: none; + width: 100% +} + +.admonitionblock > table td.icon { + text-align: center; + width: 80px +} + +.admonitionblock > table td.icon img { + max-width: none +} + +.admonitionblock > table td.icon .title { + font-weight: bold; + font-family: "Open Sans", "DejaVu Sans", sans-serif; + text-transform: uppercase +} + +.admonitionblock > table td.content { + padding-left: 1.125em; + padding-right: 1.25em; + border-left: 1px solid #ddddd8; + color: rgba(0, 0, 0, .6) +} + +.admonitionblock > table td.content > :last-child > :last-child { + margin-bottom: 0 +} + +.exampleblock > .content { + border-style: solid; + border-width: 1px; + border-color: #e6e6e6; + margin-bottom: 1.25em; + padding: 1.25em; + background: #fff; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.exampleblock > .content > :first-child { + margin-top: 0 +} + +.exampleblock > .content > :last-child { + margin-bottom: 0 +} + +.sidebarblock { + border-style: solid; + border-width: 1px; + border-color: #e0e0dc; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f8f8f7; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.sidebarblock > :first-child { + margin-top: 0 +} + +.sidebarblock > :last-child { + margin-bottom: 0 +} + +.sidebarblock > .content > .title { + color: #7a2518; + margin-top: 0; + text-align: center +} + +.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { + margin-bottom: 0 +} + +.literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { + background: #f7f7f8 +} + +.sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { + background: #f2f1f1 +} + +.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { + -webkit-border-radius: 4px; + border-radius: 4px; + word-wrap: break-word; + padding: 1em; + font-size: .8125em +} + +.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { + overflow-x: auto; + white-space: pre; + word-wrap: normal +} + +@media only screen and (min-width: 768px) { + .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { + font-size: .90625em + } +} + +@media only screen and (min-width: 1280px) { + .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { + font-size: 1em + } +} + +.literalblock.output pre { + color: #f7f7f8; + background-color: rgba(0, 0, 0, .9) +} + +.listingblock pre.highlightjs { + padding: 0 +} + +.listingblock pre.highlightjs > code { + padding: 1em; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.listingblock pre.prettyprint { + border-width: 0 +} + +.listingblock > .content { + position: relative +} + +.listingblock code[data-lang]:before { + display: none; + content: attr(data-lang); + position: absolute; + font-size: .75em; + top: .425rem; + right: .5rem; + line-height: 1; + text-transform: uppercase; + color: #999 +} + +.listingblock:hover code[data-lang]:before { + display: block +} + +.listingblock.terminal pre .command:before { + content: attr(data-prompt); + padding-right: .5em; + color: #999 +} + +.listingblock.terminal pre .command:not([data-prompt]):before { + content: "$" +} + +table.pyhltable { + border-collapse: separate; + border: 0; + margin-bottom: 0; + background: none +} + +table.pyhltable td { + vertical-align: top; + padding-top: 0; + padding-bottom: 0; + line-height: 1.45 +} + +table.pyhltable td.code { + padding-left: .75em; + padding-right: 0 +} + +pre.pygments .lineno, table.pyhltable td:not(.code) { + color: #999; + padding-left: 0; + padding-right: .5em; + border-right: 1px solid #ddddd8 +} + +pre.pygments .lineno { + display: inline-block; + margin-right: .25em +} + +table.pyhltable .linenodiv { + background: none !important; + padding-right: 0 !important +} + +.quoteblock { + margin: 0 1em 1.25em 1.5em; + display: table +} + +.quoteblock > .title { + margin-left: -1.5em; + margin-bottom: .75em +} + +.quoteblock blockquote, .quoteblock blockquote p { + color: rgba(0, 0, 0, .85); + font-size: 1.15rem; + line-height: 1.75; + word-spacing: .1em; + letter-spacing: 0; + font-style: italic; + text-align: justify +} + +.quoteblock blockquote { + margin: 0; + padding: 0; + border: 0 +} + +.quoteblock blockquote:before { + content: "\201c"; + float: left; + font-size: 2.75em; + font-weight: bold; + line-height: .6em; + margin-left: -.6em; + color: #7a2518; + text-shadow: 0 1px 2px rgba(0, 0, 0, .1) +} + +.quoteblock blockquote > .paragraph:last-child p { + margin-bottom: 0 +} + +.quoteblock .attribution { + margin-top: .5em; + margin-right: .5ex; + text-align: right +} + +.quoteblock .quoteblock { + margin-left: 0; + margin-right: 0; + padding: .5em 0; + border-left: 3px solid rgba(0, 0, 0, .6) +} + +.quoteblock .quoteblock blockquote { + padding: 0 0 0 .75em +} + +.quoteblock .quoteblock blockquote:before { + display: none +} + +.verseblock { + margin: 0 1em 1.25em 1em +} + +.verseblock pre { + font-family: "Open Sans", "DejaVu Sans", sans; + font-size: 1.15rem; + color: rgba(0, 0, 0, .85); + font-weight: 300; + text-rendering: optimizeLegibility +} + +.verseblock pre strong { + font-weight: 400 +} + +.verseblock .attribution { + margin-top: 1.25rem; + margin-left: .5ex +} + +.quoteblock .attribution, .verseblock .attribution { + font-size: .9375em; + line-height: 1.45; + font-style: italic +} + +.quoteblock .attribution br, .verseblock .attribution br { + display: none +} + +.quoteblock .attribution cite, .verseblock .attribution cite { + display: block; + letter-spacing: -.025em; + color: rgba(0, 0, 0, .6) +} + +.quoteblock.abstract { + margin: 0 0 1.25em 0; + display: block +} + +.quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { + text-align: left; + word-spacing: 0 +} + +.quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { + display: none +} + +table.tableblock { + max-width: 100%; + border-collapse: separate +} + +table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { + margin-bottom: 0 +} + +table.tableblock, th.tableblock, td.tableblock { + border: 0 solid #dedede +} + +table.grid-all th.tableblock, table.grid-all td.tableblock { + border-width: 0 1px 1px 0 +} + +table.grid-all tfoot > tr > th.tableblock, table.grid-all tfoot > tr > td.tableblock { + border-width: 1px 1px 0 0 +} + +table.grid-cols th.tableblock, table.grid-cols td.tableblock { + border-width: 0 1px 0 0 +} + +table.grid-all * > tr > .tableblock:last-child, table.grid-cols * > tr > .tableblock:last-child { + border-right-width: 0 +} + +table.grid-rows th.tableblock, table.grid-rows td.tableblock { + border-width: 0 0 1px 0 +} + +table.grid-all tbody > tr:last-child > th.tableblock, table.grid-all tbody > tr:last-child > td.tableblock, table.grid-all thead:last-child > tr > th.tableblock, table.grid-rows tbody > tr:last-child > th.tableblock, table.grid-rows tbody > tr:last-child > td.tableblock, table.grid-rows thead:last-child > tr > th.tableblock { + border-bottom-width: 0 +} + +table.grid-rows tfoot > tr > th.tableblock, table.grid-rows tfoot > tr > td.tableblock { + border-width: 1px 0 0 0 +} + +table.frame-all { + border-width: 1px +} + +table.frame-sides { + border-width: 0 1px +} + +table.frame-topbot { + border-width: 1px 0 +} + +th.halign-left, td.halign-left { + text-align: left +} + +th.halign-right, td.halign-right { + text-align: right +} + +th.halign-center, td.halign-center { + text-align: center +} + +th.valign-top, td.valign-top { + vertical-align: top +} + +th.valign-bottom, td.valign-bottom { + vertical-align: bottom +} + +th.valign-middle, td.valign-middle { + vertical-align: middle +} + +table thead th, table tfoot th { + font-weight: bold +} + +tbody tr th { + display: table-cell; + line-height: 1.6; + background: #f7f8f7 +} + +tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { + color: rgba(0, 0, 0, .8); + font-weight: bold +} + +p.tableblock > code:only-child { + background: none; + padding: 0 +} + +p.tableblock { + font-size: 1em +} + +td > div.verse { + white-space: pre +} + +ol { + margin-left: 1.75em +} + +ul li ol { + margin-left: 1.5em +} + +dl dd { + margin-left: 1.125em +} + +dl dd:last-child, dl dd:last-child > :last-child { + margin-bottom: 0 +} + +ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { + margin-bottom: .625em +} + +ul.unstyled, ol.unnumbered, ul.checklist, ul.none { + list-style-type: none +} + +ul.unstyled, ol.unnumbered, ul.checklist { + margin-left: .625em +} + +ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { + width: 1em; + font-size: .85em +} + +ul.checklist li > p:first-child > input[type="checkbox"]:first-child { + width: 1em; + position: relative; + top: 1px +} + +ul.inline { + margin: 0 auto .625em auto; + margin-left: -1.375em; + margin-right: 0; + padding: 0; + list-style: none; + overflow: hidden +} + +ul.inline > li { + list-style: none; + float: left; + margin-left: 1.375em; + display: block +} + +ul.inline > li > * { + display: block +} + +.unstyled dl dt { + font-weight: 400; + font-style: normal +} + +ol.arabic { + list-style-type: decimal +} + +ol.decimal { + list-style-type: decimal-leading-zero +} + +ol.loweralpha { + list-style-type: lower-alpha +} + +ol.upperalpha { + list-style-type: upper-alpha +} + +ol.lowerroman { + list-style-type: lower-roman +} + +ol.upperroman { + list-style-type: upper-roman +} + +ol.lowergreek { + list-style-type: lower-greek +} + +.hdlist > table, .colist > table { + border: 0; + background: none +} + +.hdlist > table > tbody > tr, .colist > table > tbody > tr { + background: none +} + +td.hdlist1, td.hdlist2 { + vertical-align: top; + padding: 0 .625em +} + +td.hdlist1 { + font-weight: bold; + padding-bottom: 1.25em +} + +.literalblock + .colist, .listingblock + .colist { + margin-top: -.5em +} + +.colist > table tr > td:first-of-type { + padding: 0 .75em; + line-height: 1 +} + +.colist > table tr > td:last-of-type { + padding: .25em 0 +} + +.thumb, .th { + line-height: 0; + display: inline-block; + border: solid 4px #fff; + -webkit-box-shadow: 0 0 0 1px #ddd; + box-shadow: 0 0 0 1px #ddd +} + +.imageblock.left, .imageblock[style*="float: left"] { + margin: .25em .625em 1.25em 0 +} + +.imageblock.right, .imageblock[style*="float: right"] { + margin: .25em 0 1.25em .625em +} + +.imageblock > .title { + margin-bottom: 0 +} + +.imageblock.thumb, .imageblock.th { + border-width: 6px +} + +.imageblock.thumb > .title, .imageblock.th > .title { + padding: 0 .125em +} + +.image.left, .image.right { + margin-top: .25em; + margin-bottom: .25em; + display: inline-block; + line-height: 0 +} + +.image.left { + margin-right: .625em +} + +.image.right { + margin-left: .625em +} + +a.image { + text-decoration: none; + display: inline-block +} + +a.image object { + pointer-events: none +} + +sup.footnote, sup.footnoteref { + font-size: .875em; + position: static; + vertical-align: super +} + +sup.footnote a, sup.footnoteref a { + text-decoration: none +} + +sup.footnote a:active, sup.footnoteref a:active { + text-decoration: underline +} + +#footnotes { + padding-top: .75em; + padding-bottom: .75em; + margin-bottom: .625em +} + +#footnotes hr { + width: 20%; + min-width: 6.25em; + margin: -.25em 0 .75em 0; + border-width: 1px 0 0 0 +} + +#footnotes .footnote { + padding: 0 .375em 0 .225em; + line-height: 1.3334; + font-size: .875em; + margin-left: 1.2em; + text-indent: -1.05em; + margin-bottom: .2em +} + +#footnotes .footnote a:first-of-type { + font-weight: bold; + text-decoration: none +} + +#footnotes .footnote:last-of-type { + margin-bottom: 0 +} + +#content #footnotes { + margin-top: -.625em; + margin-bottom: 0; + padding: .75em 0 +} + +.gist .file-data > table { + border: 0; + background: #fff; + width: 100%; + margin-bottom: 0 +} + +.gist .file-data > table td.line-data { + width: 99% +} + +div.unbreakable { + page-break-inside: avoid +} + +.big { + font-size: larger +} + +.small { + font-size: smaller +} + +.underline { + text-decoration: underline +} + +.overline { + text-decoration: overline +} + +.line-through { + text-decoration: line-through +} + +.aqua { + color: #00bfbf +} + +.aqua-background { + background-color: #00fafa +} + +.black { + color: #000 +} + +.black-background { + background-color: #000 +} + +.blue { + color: #0000bf +} + +.blue-background { + background-color: #0000fa +} + +.fuchsia { + color: #bf00bf +} + +.fuchsia-background { + background-color: #fa00fa +} + +.gray { + color: #606060 +} + +.gray-background { + background-color: #7d7d7d +} + +.green { + color: #006000 +} + +.green-background { + background-color: #007d00 +} + +.lime { + color: #00bf00 +} + +.lime-background { + background-color: #00fa00 +} + +.maroon { + color: #600000 +} + +.maroon-background { + background-color: #7d0000 +} + +.navy { + color: #000060 +} + +.navy-background { + background-color: #00007d +} + +.olive { + color: #606000 +} + +.olive-background { + background-color: #7d7d00 +} + +.purple { + color: #600060 +} + +.purple-background { + background-color: #7d007d +} + +.red { + color: #bf0000 +} + +.red-background { + background-color: #fa0000 +} + +.silver { + color: #909090 +} + +.silver-background { + background-color: #bcbcbc +} + +.teal { + color: #006060 +} + +.teal-background { + background-color: #007d7d +} + +.white { + color: #bfbfbf +} + +.white-background { + background-color: #fafafa +} + +.yellow { + color: #bfbf00 +} + +.yellow-background { + background-color: #fafa00 +} + +span.icon > .fa { + cursor: default +} + +.admonitionblock td.icon [class^="fa icon-"] { + font-size: 2.5em; + text-shadow: 1px 1px 2px rgba(0, 0, 0, .5); + cursor: default +} + +.admonitionblock td.icon .icon-note:before { + content: "\f05a"; + color: #19407c +} + +.admonitionblock td.icon .icon-tip:before { + content: "\f0eb"; + text-shadow: 1px 1px 2px rgba(155, 155, 0, .8); + color: #111 +} + +.admonitionblock td.icon .icon-warning:before { + content: "\f071"; + color: #bf6900 +} + +.admonitionblock td.icon .icon-caution:before { + content: "\f06d"; + color: #bf3400 +} + +.admonitionblock td.icon .icon-important:before { + content: "\f06a"; + color: #bf0000 +} + +.conum[data-value] { + display: inline-block; + color: #fff !important; + background-color: rgba(0, 0, 0, .8); + -webkit-border-radius: 100px; + border-radius: 100px; + text-align: center; + font-size: .75em; + width: 1.67em; + height: 1.67em; + line-height: 1.67em; + font-family: "Open Sans", "DejaVu Sans", sans-serif; + font-style: normal; + font-weight: bold +} + +.conum[data-value] * { + color: #fff !important +} + +.conum[data-value] + b { + display: none +} + +.conum[data-value]:after { + content: attr(data-value) +} + +pre .conum[data-value] { + position: relative; + top: -.125em +} + +b.conum * { + color: inherit !important +} + +.conum:not([data-value]):empty { + display: none +} + +dt, th.tableblock, td.content, div.footnote { + text-rendering: optimizeLegibility +} + +h1, h2, p, td.content, span.alt { + letter-spacing: -.01em +} + +p strong, td.content strong, div.footnote strong { + letter-spacing: -.005em +} + +p, blockquote, dt, td.content, span.alt { + font-size: 1.0625rem +} + +p { + margin-bottom: 1.25rem +} + +.sidebarblock p, .sidebarblock dt, .sidebarblock td.content, p.tableblock { + font-size: 1em +} + +.exampleblock > .content { + background-color: #fffef7; + border-color: #e0e0dc; + -webkit-box-shadow: 0 1px 4px #e0e0dc; + box-shadow: 0 1px 4px #e0e0dc +} + +.print-only { + display: none !important +} + +@media print { + @page { + margin: 1.25cm .75cm + } + + * { + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important + } + + a { + color: inherit !important; + text-decoration: underline !important + } + + a.bare, a[href^="#"], a[href^="mailto:"] { + text-decoration: none !important + } + + a[href^="http:"]:not(.bare):after, a[href^="https:"]:not(.bare):after { + content: "(" attr(href) ")"; + display: inline-block; + font-size: .875em; + padding-left: .25em + } + + abbr[title]:after { + content: " (" attr(title) ")" + } + + pre, blockquote, tr, img, object, svg { + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + svg { + max-width: 100% + } + + p, blockquote, dt, td.content { + font-size: 1em; + orphans: 3; + widows: 3 + } + + h2, h3, #toctitle, .sidebarblock > .content > .title { + page-break-after: avoid + } + + #toc, .sidebarblock, .exampleblock > .content { + background: none !important + } + + #toc { + border-bottom: 1px solid #ddddd8 !important; + padding-bottom: 0 !important + } + + .sect1 { + padding-bottom: 0 !important + } + + .sect1 + .sect1 { + border: 0 !important + } + + #header > h1:first-child { + margin-top: 1.25rem + } + + body.book #header { + text-align: center + } + + body.book #header > h1:first-child { + border: 0 !important; + margin: 2.5em 0 1em 0 + } + + body.book #header .details { + border: 0 !important; + display: block; + padding: 0 !important + } + + body.book #header .details span:first-child { + margin-left: 0 !important + } + + body.book #header .details br { + display: block + } + + body.book #header .details br + span:before { + content: none !important + } + + body.book #toc { + border: 0 !important; + text-align: left !important; + padding: 0 !important; + margin: 0 !important + } + + body.book #toc, body.book #preamble, body.book h1.sect0, body.book .sect1 > h2 { + page-break-before: always + } + + .listingblock code[data-lang]:before { + display: block + } + + #footer { + background: none !important; + padding: 0 .9375em + } + + #footer-text { + color: rgba(0, 0, 0, .6) !important; + font-size: .9em + } + + .hide-on-print { + display: none !important + } + + .print-only { + display: block !important + } + + .hide-for-print { + display: none !important + } + + .show-for-print { + display: inherit !important + } +} diff --git a/docs/stylesheets/gh-pages.css b/docs/stylesheets/gh-pages.css index 121cac3885f..423b6c50591 100644 --- a/docs/stylesheets/gh-pages.css +++ b/docs/stylesheets/gh-pages.css @@ -52,7 +52,7 @@ h6 > a.link { .literalblock > .title, .stemblock > .title, .openblock > .title, -.paragraph >.title, +.paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, @@ -204,7 +204,7 @@ table.tableblock > .title, /* Do not display site header on print mediums */ @media print { - #seedu-header { + #draganddrop-header { display: none; } diff --git a/docs/team/aegis-bot.adoc b/docs/team/aegis-bot.adoc new file mode 100644 index 00000000000..1098cd0a49c --- /dev/null +++ b/docs/team/aegis-bot.adoc @@ -0,0 +1,111 @@ += Tin Hong Wen - Project Portfolio +:site-section: AboutUs +:imagesDir: ../images +:stylesDir: ../stylesheets + +== PROJECT: Study Buddy + +== Overview + +StudyBuddy is a desktop application designed for students who *wish to manage their module related tasks* in a convenient and user-friendly interface. +It is *optimized for those who prefer to work with a Command Line Interface* (CLI) but still contains some aspects of Graphical User Interface (GUI) which was written using JavaFX. +The codebase is in Java and contains about 13kLoc. + +== Summary of contributions + +=== Main Enhancements + +==== Designed the Module Feature +** Function: +This optional feature enables users to view their tasks sorted according to the modules that they have taken. +Each module is designed to contain a name, a unique module code, as well as all the tasks that it holds. +Users can choose to assign their task to any module they want (or not at all), as well as create new modules, +edit or delete any existing modules. + +** Justification: +Given how college students have many, many task coming from multiple assignments, +I believe this is one of the good way they can organise and view their tasks if they need to sift +multiple tasks. + +** Highlights: +One of the challenging features is to design something for tasks that do not have any modules +assigned to them. All task by default will have a module attached to them, so we have to create a "figurehead" module +for these tasks. This figurehead module have to be able to conceal its module code from the user and has to prevent +users from edits and deletes. + +Another difficulty is dealing with storage. To avoid changing the order of the tasks, module has to be designed to +temporarily store tasks instead of actually storing it in the program. + + +==== Edit & Create Module Function +** Function: +These 2 features allows users to create new modules, as well as edit existing modules. Users cannot +create any modules with duplicate names or code, or those with invalid module codes. In `edit mods`, +users can choose to edit name, code or even delete existing modules. + +** Highlights: +One key challenge with designing `edit mod` function is dealing with existing tasks is under the module. +The program has to be designed to change the module of each consecutive task that was under the module, +making this portion fragile. + +==== Added Complete Function +** Function: +Allows users to set their task from pending to `Finished`. +** Justification: +To allow users to mark their task as complete so that it can be easily ignored /hidden by the user. + + +=== Minor Enhancements +==== Added 'modules' option in Edit function +** Function: +Allow users to edit change the module in which the task was assigned to. + +** Justification: +So that users can edit and reassign task to a different existing module. + + +=== Team-based Tasks +.. Debugged a serious bug involving storage that was holding the entire team back for a week at the start of tP. +.. Help to refactor team's code by creating parent class. +.. Helped repackaged some of the old codes into separate folders, as well as reorganizing +`commands` and `interactiveprompts` into many folders +.. Modified & cropped many of the team's UG images for better readability. +.. Helped shorten some existing nested codes with `streams`. + +=== Review/Mentoring + +* Left constructive feedback on teammate's repo. +* Left feedback for another team's DG. https://github.com/AY1920S2-CS2103-W14-3/main/issues/59[59] +* Left feedback for another team's UG. https://github.com/aegis-bot/ped/issues/4 [4] + + + +=== Code contributed: +https://nus-cs2103-ay1920s2.github.io/tp-dashboard/#search=aegis-bot&sort=groupTitle&sortWithin=title&since=2020-02-14&timeframe=commit&mergegroup=false&groupSelect=groupByRepos&breakdown=false + + +=== User guide + +|=== +|_Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users._ +|=== + +include::../UserGuide.adoc[tag=intro] +include::../UserGuide.adoc[tag=Done] +include::../UserGuide.adoc[tag=Modules] + + +=== Developer Guide + +|=== +|_Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project._ +|=== + +include::../DeveloperGuide.adoc[tag = ArchitectureDiagram] +include::../DeveloperGuide.adoc[tag = mod] + +. Diagrams: +.. https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/ArchitectureDiagram.puml[ArchitectureDiagram] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/ModuleSequenceDiagram.puml.puml[ModuleSequenceDiagram] + + diff --git a/docs/team/gx-huang.adoc b/docs/team/gx-huang.adoc new file mode 100644 index 00000000000..4eda51ba9a0 --- /dev/null +++ b/docs/team/gx-huang.adoc @@ -0,0 +1,86 @@ += Huang ge xiang - Project Portfolio +:site-section: AboutUs +:imagesDir: ../images +:stylesDir: ../stylesheets + +== PROJECT: Study Buddy + +== Overview + +StudyBuddy is a desktop application designed for students who *wish to manage their module related tasks* in a convenient and user-friendly interface. +It is *optimized for those who prefer to work with a Command Line Interface* (CLI) but still contains the benefits of *Graphical User Interface* (GUI). +The codebase is in Java and contains about 13kLoc. + +== Summary of contributions + +=== Enhancements + +*Major enhancements* + +* Added a *calendar* to Study buddy. +** _What it does_: +*** The calendar allows users to have an overview of all the tasks that has to be done. +*** Calendar also allows you to view all tasks due on the day the user clicks on. +** _Justification_: +*** This feature is important as the task list will be too cluttered without it. +*** A calendar gives a good indication of how busy the user is going to be. +** _Highlights_ ++ +Challenges faced when implementing this feature: + +. Had to learn what the different panes and objects in javafx does and choose the most suitable one for the feature +. There was an 50% chance (tested) the click event would return the wrong object, +leading to complications. This meant that tasks cannot be within the calendar itself. +I had to reverse engineer the algorithm used to generate a calendar and use that data to find tasks for the date the user clicked on. + +* *Archive* and *unarchive* +** _What it does_: +*** Allows users to store their task into a separate archive list +*** Unarchive retrieves tasks from archive list and stores it into the main list +** _Justification_: +*** Archive allows users to store task that they have completed or do not wish to look at right now, while still keeping those tasks in check. +*** This is important as users sometimes do not wish to delete a task they completed. +** _Highlights_: +*** This feature was not particularly difficult to implement. However, as it is the first feature to be pushed to address book, +I had to carefully trace and modify the code to make sure it did not break address book. + +*Minor enhancements* + +* *Calendar view command* +** Calendar view command was created in response to an https://github.com/AY1920S2-CS2103T-W16-3/main/issues/217[issue] that claimed the app is not CLI friendly. +** This command allows a user to jump to any date they want to on the calendar. +** It also serves as a way to find tasks by date. + +=== Code contributed +https://nus-cs2103-ay1920s2.github.io/tp-dashboard/#=undefined&search=gx-huang[Tp-dashboard] + +=== Team-based Tasks +* Helped set up the github team and repo. +* Assigned issues to my team mates. https://github.com/AY1920S2-CS2103T-W16-3/main/issues/33[33], https://github.com/AY1920S2-CS2103T-W16-3/main/issues/31[31] +* Wrote proposed feature in developer's guide. +* Created test cases for classes that were not mine. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/61[61] + +=== Review/Mentoring +* Left constructive feedback on my team mate's pull request. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/58[58] +* Helped resolve some issues my team mates had regarding address book 3. https://github.com/AY1920S2-CS2103T-W16-3/main/issues/49[49] +* Left feedback for another team's DG. https://github.com/AY1920S2-CS2103-W14-3/main/issues/59[59] + +=== User guide contributions + +======= +Given below is a section that I contributed to the User Guide. It showcases my ability to write documentation targeting end-users. +======= + +include::../UserGuide.adoc/[tag=calendar] + +=== Developer Guide contributions + +======= +Given below are some sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project. +======= + +include::../DeveloperGuide.adoc/[tag=calendar] + +include::../DeveloperGuide.adoc/[tag=archive] + +include::../DeveloperGuide.adoc/[tag=dataencryption] diff --git a/docs/team/johndoe.adoc b/docs/team/johndoe.adoc deleted file mode 100644 index f39e76e49b2..00000000000 --- a/docs/team/johndoe.adoc +++ /dev/null @@ -1,72 +0,0 @@ -= John Doe - Project Portfolio -:site-section: AboutUs -:imagesDir: ../images -:stylesDir: ../stylesheets - -== PROJECT: AddressBook - Level 3 - ---- - -== Overview - -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. - -== Summary of contributions - -* *Major enhancement*: added *the ability to undo/redo previous commands* -** What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command. -** Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them. -** Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands. -** Credits: _{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}_ - -* *Minor enhancement*: added a history command that allows the user to navigate to previous commands using up/down keys. - -* *Code contributed*: [https://github.com[Functional code]] [https://github.com[Test code]] _{give links to collated code files}_ - -* *Other contributions*: - -** Project management: -*** Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub -** Enhancements to existing features: -*** Updated the GUI color scheme (Pull requests https://github.com[#33], https://github.com[#34]) -*** Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests https://github.com[#36], https://github.com[#38]) -** Documentation: -*** Did cosmetic tweaks to existing contents of the User Guide: https://github.com[#14] -** Community: -*** PRs reviewed (with non-trivial review comments): https://github.com[#12], https://github.com[#32], https://github.com[#19], https://github.com[#42] -*** Contributed to forum discussions (examples: https://github.com[1], https://github.com[2], https://github.com[3], https://github.com[4]) -*** Reported bugs and suggestions for other teams in the class (examples: https://github.com[1], https://github.com[2], https://github.com[3]) -*** Some parts of the history feature I added was adopted by several other class mates (https://github.com[1], https://github.com[2]) -** Tools: -*** Integrated a third party library (Natty) to the project (https://github.com[#42]) -*** Integrated a new Github plugin (CircleCI) to the team repo - -_{you can add/remove categories in the list above}_ - -== Contributions to the User Guide - - -|=== -|_Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users._ -|=== - -include::../UserGuide.adoc[tag=delete] - -include::../UserGuide.adoc[tag=dataencryption] - -== Contributions to the Developer Guide - -|=== -|_Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project._ -|=== - -include::../DeveloperGuide.adoc[tag=undoredo] - -include::../DeveloperGuide.adoc[tag=dataencryption] - - -== PROJECT: PowerPointLabs - ---- - -_{Optionally, you may include other projects in your portfolio.}_ diff --git a/docs/team/souwmyaa.adoc b/docs/team/souwmyaa.adoc new file mode 100644 index 00000000000..de8eba5509d --- /dev/null +++ b/docs/team/souwmyaa.adoc @@ -0,0 +1,80 @@ +:site-section: AboutUs +:imagesDir: ../images +:stylesDir: ../stylesheets + +=== [teal]#*Soumwyaa Sabarinathann - Project Portfolio*# + +[teal]#*Project: Study Buddy*# + +[teal]#*Overview*# + +StudyBuddy is a desktop application designed for students who *wish to manage their module related tasks* in a convenient and user-friendly interface. The application is written in Java and spans over 12k lines of code. + +[teal]#*Summary of contributions*# + +* *Major enhancement*: added *the Due Soon List feature* +** Function: +It allows users to view a list of tasks due within the next week in one panel. It also displays time left before the deadline for each due soon task, auto-sorts tasks to be in order of most urgent to least urgent deadline and auto-updates when changes are made to the data (additions, deletions, edits etc). + +It also provides a refresh command that is used to update the due soon list so it doesn't become invalid after a certain duration of time. +** Justification: +Helpful to the user because it reminds them of upcoming deadlines. +** Highlights: +This implementation was challenging because it required changes to be made to every command that changed data. It involved working in the logic, model, storage and UI components of the code base. It also involved changing the GUI. + +* *Major enhancement*: added *the Add Duplicate Tasks feature* +** Function: +It allows users to add duplicate tasks by automatically appending brackets with a number to its task name. The number corresponds to the number of times task has been duplicated. +** Justification: +If the user makes a mistake in one field while adding task, they will have to re-enter all 12 fields if duplicates are not allowed. +** Highlights: +It required working on other commands, such as edit command and unarchive command to prevent duplication. Since study buddy already had a lot of checks to prevent duplicate tasks, it required a large amount of refactoring code. + +* *Minor enhancement*: added *the Delete Task command* +** Function: Allows user to delete an existing task in the list +** Justification: Helpful to the user because it enables them to remove tasks from their list. + +* *Minor enhancement*: added *the Filter command* +** Function: Allows user to filter by status (eg: finished, pending etc) or by type (eg: assignment, quiz etc) +** Justification: This feature is extremely helpful to the user because it enables them to filter their list of all tasks by various categories. + +[teal]#*Code contributed:*# + +https://nus-cs2103-ay1920s2.github.io/tp-dashboard/#=undefined&search=souwmyaa + +[teal]#*Team-based Tasks*# + +1. Refactored all occurrences of Address Book to Study Buddy. Link to Pull Request https://github.com/AY1920S2-CS2103T-W16-3/main/pull/135[#135] + +2. Helped to maintain the issue tracker. Links to issues https://github.com/AY1920S2-CS2103T-W16-3/main/issues/283[#283], https://github.com/AY1920S2-CS2103T-W16-3/main/issues/268[#268]. + +3. Attempted to find bugs in all team members code to help them fix any issues. Links to issues https://github.com/AY1920S2-CS2103T-W16-3/main/issues/107[#107], https://github.com/AY1920S2-CS2103T-W16-3/main/issues/256[#256] + +4. Wrote test cases for error-prone classes, even if they were not mine. Links to Pull Requests https://github.com/AY1920S2-CS2103T-W16-3/main/pull/166[#166], https://github.com/AY1920S2-CS2103T-W16-3/main/pull/139[#139] + +5. Contributed to the forum. Link to issue https://github.com/nus-cs2103-AY1920S2/forum/issues/75[#75] + +[teal]#*Review/Mentoring*# + +1. Reviewed other members Pull Requests. Links to Pull Requests https://github.com/AY1920S2-CS2103T-W16-3/main/pull/59[#59], https://github.com/AY1920S2-CS2103T-W16-3/main/pull/279[#279] + +2. Reviewed another team's DG and provided useful feedback. Links to issues https://github.com/AY1920S2-CS2103T-W17-3/main/issues/208[#208], https://github.com/AY1920S2-CS2103T-W17-3/main/issues/204[#204] + +[teal]#*User guide*# + +|=== +|_Given below is a section that I contributed to the User Guide. It showcases my ability to write documentation targeting end-users._ +|=== + +include::../UserGuide.adoc[tag=delete] + +[teal]#*Developer Guide*# + +|=== +|_Given below are some sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project._ +|=== + +include::../DeveloperGuide.adoc[tag=dueSoon] +include::../DeveloperGuide.adoc[tag=refresh] + +Diagrams: + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/ModelClassDiagram.puml[Model class diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/DueSoonActivityDiagram.puml[Due soon activity diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/DueSoonSequenceDiagram.puml[Due soon sequence diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/AddDueSoonActivityDiagram.puml[Add due soon task activity diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/AddDueSoonSequence.puml[Add due soon task sequence diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/DeleteDueSoonActivityDiagram.puml[Delete due soon task activity diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/DeleteDueSoonSequence.puml[Delete due soon task sequence diagram] + + diff --git a/docs/team/teikjun.adoc b/docs/team/teikjun.adoc new file mode 100644 index 00000000000..4d182038055 --- /dev/null +++ b/docs/team/teikjun.adoc @@ -0,0 +1,92 @@ +:site-section: AboutUs +:imagesDir: ../images +:stylesDir: ../stylesheets + +=== [teal]#*Tan Teik Jun - Project Portfolio*# + +[teal]#*Project: Study Buddy*# + +[teal]#*Overview*# + +StudyBuddy is a desktop application designed for students who *wish to manage their module related tasks* in a convenient and user-friendly interface. The application is written in Java and spans over 12k lines of code. + +[teal]#*Summary of contributions*# + +* *Major enhancement*: added *Productivity feature* +** Function: +It allows the user to keep track of productivity in a fun manner. The productivity feature displays metrics that are recorded over the past day, week, and more. It also introduces a point and rank system to gamify the user experience. +** Justification: +This is helpful to the user as it allows the user to keep track of progress in an interesting way. +** Highlights: +This implementation was challenging because it required a lot of statistics to be logged all over the application. Finally, these statistics needed to be displayed on the Ui in an visually appealing and useful manner. + +* *Major enhancement*: added *the Edit Task command* +** Function: +The edit command allows the user to edit any information about the tasks. +This includes the task name, date, description, etc. +** Justification: +If the user needs to edit the detail of the task, the user can simply use the edit +command instead of deleting the task and creating a new one. This is hugely convenient for the user. +** Highlights: +This implementation was challenging because editing things may lead to a lot of side effects. However, I have managed to avoid these side effects by using defensive programming. + +* *Minor enhancement*: added *the Find Task command* +** Function: Allows user to find an existing task in the list +** Justification: Helpful to the user when the list is long because it enables them to look for a certain task in the list. + +* *Minor enhancement*: added *the List command* +** Function: Allows user to list all the existing tasks. +** Justification: After using a command like Find or Filter, the List command is necessary to recover the original list. + +* *Minor enhancement*: added *the Help command* +** Function: Shows the user the list of available commands and the user guide. +** Justification: Users require the help command when they are unsure of how to use the application. + +* *Minor enhancement*: added *navigation shortcuts for pages* +** Function: Allows user to navigate the pages using keys instead of using +** Justification: This feature helps fast typists (the target user) work more efficiently. + +[teal]#*Code contributed:*# + +https://nus-cs2103-ay1920s2.github.io/tp-dashboard/#=undefined&search=teikjun + +[teal]#*Team-based Tasks*# + +1. Set up the team repository and ensured that the repository was protected from any accidental merges. + +2. Ensured that the integration process was smooth and bug-free. Set up Travis and AppVeyor to ensure that only working code is integrated. + +3. Ensured code quality was well-maintained. Set up Codacy to keep track of code quality and coverage. + +4. Ensured that the code was well-tested. I wrote tests for classes that were error-prone, and set up Coveralls to keep track of code coverage. + +5. Helped to maintain the issue tracker. Links to issues https://github.com/AY1920S2-CS2103T-W16-3/main/issues/46[#46], https://github.com/AY1920S2-CS2103T-W16-3/main/issues/47[#47]. + + + +[teal]#*Review/Mentoring*# + +1. Reviewed other members Pull Requests and helped them learn git workflow. Example Pull Request: https://github.com/AY1920S2-CS2103T-W16-3/main/pull/56[#56] + +2. Reviewed another team's DG and provided useful feedback. Example Issue: https://github.com/AY1920S2-CS2103T-W17-3/main/issues/209[#209] + + + + +[teal]#*User guide*# + +|=== +|_Given below is a section that I contributed to the User Guide. It showcases my ability to write documentation targeting end-users._ +|=== + + +include::../UserGuide.adoc[tag=productivity] + +[teal]#*Developer Guide*# + +|=== +|_Given below are some sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project._ +|=== + +include::../DeveloperGuide.adoc[tag=logicComponent] +include::../DeveloperGuide.adoc[tag=productivity] + + +Diagrams: + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/ListTaskSequenceDiagram.puml[Add List Task Sequence Diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/LogicClassDiagram.puml[Add Logic Class Diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/ProductivityObjectDiagram.puml[Add Productivity Feature Object Diagram] + +https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/ProductivityActivityDiagram.puml[Add Productivity Feature Activity Diagram] + + diff --git a/docs/team/teikjun.pdf b/docs/team/teikjun.pdf new file mode 100644 index 00000000000..c5436239759 Binary files /dev/null and b/docs/team/teikjun.pdf differ diff --git a/docs/team/wyt-sonia.adoc b/docs/team/wyt-sonia.adoc new file mode 100644 index 00000000000..f83abf009a3 --- /dev/null +++ b/docs/team/wyt-sonia.adoc @@ -0,0 +1,175 @@ +:site-section: AboutUs +:imagesDir: ../images +:stylesDir: ../stylesheets += Wang Yuting - Project Portfolio + +== PROJECT: Study Buddy + +== Overview + +StudyBuddy is a desktop application designed for students who *wish to manage their module related tasks* in a convenient and user-friendly interface. The application is written in Java and spans over 12k lines of code. + +== Summary of contributions + +* *Major enhancement*: designed *the interactive process logic* +** *Function*: +. It allows user to execute his/her command in an interactive way. +. Display clear instruction or error message at each interaction step. +. When invalid command received (e.g. the user made a typo mistake), the interaction will not +terminate, instead, it will response with clear instruction and wait for user's next action. +. Allow user to quit from interaction using "quit" keyword. +** *Justification*: + +. This feature saves user from remembering long, wordy commands to use the command line interface. +. The "stay and wait" reaction against any invalid input improves the typo-tolerance of the application, which contributes a +notable benefit to CLI users. +** *Highlights*: +. The implementation was challenging because it required a huge changes in the original logic. +. The time left me to design and develop this logic was tight because +I needed to finish it so that my team can started to work on their own part. + +* *Major enhancement*: designed *the UI/UX of Study Buddy* +** *Function*: +. The GUI of: +.. Landing page (i.e. the all tasks page) +.. Modules page +.. Statistics page +.. Calendar page +.. The Task card (i.e. the items in task list) +. Responsive layout. The inner components can automatically adjust themselves according to +the current width and height. +. The mouse events when: +.. hovering on menu bar item, calendar button, as well as tabs in modules and statistics page +.. focusing on list items (e.g. all tasks list) +.. clicking on chars in statistics page +** *Justification*: +. The GUI of this application follows a relaxed style, +which helps users to ease the pressure accumulated from school. +. The responsive layout allows the application to be adapted to different screen sizes. +. The mouse event makes it easier for user to focus on what he/she is doing. +** *Highlights*: ++ +To design and implement of the UI/UX requires lot of self-learning and reference. + +* *Major enhancement*: added *task summary feature* +** *Function*: +. Automatically summarizes the collected data into different charts. +.. *pie chart* compares the number of tasks in different statuses. +.. *area chart* summarizes the task deadlines or start dates for different modules. +.. *stacked bar chart* compares the weight of different types of tasks in each module +. Retrieves and displays relevant tasks when user clicking on a chart. +. Listen to the data change and update simultaneously. +** *Justification*: +. The statistics helps user to integrates scattered information in one place and represents in dynamic charts, +witch makes the information more straightforward. +. With this feature, user can be more productive as they have better idea of what is going on and +what is more important. +. The statistics is auto-generated along the way the user managing their records using keyboard input, +which means this feature can contribute significant value to those fast typist. +** *Highlights*: +. The data bind of each chart is not easy to implement, especially when I take this opportunity to +practice on Lambda. +. It also needs to be careful when choosing a suitable chart for a data set. Even for the same collection of data, +the comparison results obtained from different charts can be variant. + +* *Major enhancement*: added *the Add and Edit command* +** *Function*: ++ +. Add: Allows user to add a new task in the list. +. Edit: Allows user to edit an existing task in the list. +** *Justification*: ++ +This feature is extremely helpful to the user because it enables them to insert and edit task. +** *Highlights*: ++ +Implementing this basic functionality is not easy because it involves a lot of obvious and non-obvious validation, +such as: + +.. obvious: empty input for required fields, wrong input format etc. +.. non-obvious: the validation of time, task weight etc. + + +* *Minor enhancement*: added *the Sort command* +** *Function*: +. Allows user to sort their tasks by: +.. Deadline / Task Start Date +.. Task Name +.. Creation Date & Time +** *Justification*: ++ +This feature can help uer to prioritize their task by desired aspect. + + +=== Code contributed: +. https://nus-cs2103-ay1920s2.github.io/tp-dashboard/#search=wyt-sonia[code contribution link] + +=== Team-based Tasks + +. Morphed the original AB3 into a different product: Study Buddy +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/27[Interactive feature implemented with Add Task function] + +. Renamed the product +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/15[Update project name and Travis link] + +. Edited and provided all pictures for User Guide: +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/265[UG update and bug fix] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/262[Bug fixes and UG update] + +. Improved the code quality for the whole project: +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/276[Code quality] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/271[Code quality improvement] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/182[Code quality improves] + +. Troubleshoot and fixed bugs at the whole project scope: +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/100[bug fix for overdue check] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/124[DG update and bug fix] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/98[Bug fixed: Bug with task index] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/59[Bug fix, Quit/Sort function implementing and UI improving] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/63[Bug fix for not handling invalid user input] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/279[more log, bug fix, typo fix] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/262[Bug fixes and UG update] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/240[module index bug fix] + +. Helped Implemented the GUI for the whole project: +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/74[GUI for list view updated and GUI bug fix] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/71[GUI improvement] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/59[Bug fix, Quit/Sort function implementing and UI improving] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/89[UI improvement and better tracking of task status] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/pull/257[UI update and UG update] + +=== Review/Mentoring +. Reviewed another team's DG and provided useful feedback. +.. https://github.com/AY1920S2-CS2103T-W17-3/main/issues/206[Review for DG] +.. https://github.com/AY1920S2-CS2103T-W17-3/main/issues/207[Review for DG_02] +.. https://github.com/AY1920S2-CS2103T-W17-3/main/issues/210[Review for DG 03] + + +=== User guide + +|=== +|_Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users._ +|=== + +include::../UserGuide.adoc[tag=intro] +include::../UserGuide.adoc[tag=add] +include::../UserGuide.adoc[tag=edit] +include::../UserGuide.adoc[tag=sort] +include::../UserGuide.adoc[tag=Statistics] + +=== Developer Guide + +|=== +|_Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project._ +|=== + +include::../DeveloperGuide.adoc[tag=UIComponent] +include::../DeveloperGuide.adoc[tag=InteractiveCommandProcessFeature] +include::../DeveloperGuide.adoc[tag=taskSummary] ++ + +. Diagrams: +.. https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/UiClassDiagram.puml[UI class diagram] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/AddTaskObjectDiagram.puml[Add task object diagram] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/QuitFromInteractionActivityDiagram.puml[Quit from interaction activity diagram] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/TaskSummaryOnClickActivityDiagram.puml[Task summary on click activity diagram] +.. https://github.com/AY1920S2-CS2103T-W16-3/main/blob/master/docs/diagrams/TaskSummaryOnDataChangeSequenceDiagram.puml[Task summary on data changing sequence diagram] + diff --git a/docs/templates/_header.html.slim b/docs/templates/_header.html.slim index 3c2d5aed43c..75f76ac5341 100644 --- a/docs/templates/_header.html.slim +++ b/docs/templates/_header.html.slim @@ -1,25 +1,15 @@ / NOTE: You must restart the gradle daemon after modifying any template file for the changes to take effect. -- if !(attr? 'no-site-header') && (attr? 'site-seedu') - #seedu-header +- if !(attr? 'no-site-header') && (attr? 'site-draganddrop') + #draganddrop-header nav.navbar.navbar-lg.navbar-light.bg-lighter .container a.navbar-brand href='https://se-edu.github.io/' - img src=(site_url 'images/SeEduLogo.png') alt='SE-EDU' + img src=(site_url 'images/draganddropLogo.png') alt='SE-EDU' ul.navbar-nav li.nav-item - a.nav-link href='https://se-edu.github.io/addressbook-level1' AB-1 - li.nav-item - a.nav-link href='https://se-edu.github.io/addressbook-level2' AB-2 + a.nav-link href='https://github.com/AY1920S2-CS2103T-W16-3/main' AB-1 li.nav-item a.nav-link.active href=(site_url 'index.html') AB-3 - li.nav-item - a.nav-link href='https://se-edu.github.io/addressbook-level4' AB-4 - li.nav-item - a.nav-link href='https://se-edu.github.io/collate' Collate - li.nav-item - a.nav-link href='https://se-edu.github.io/se-book' Book - li.nav-item - a.nav-link href='https://se-edu.github.io/learningresources' Resources - if !(attr? 'no-site-header') #site-header @@ -32,7 +22,7 @@ =nav_link('UserGuide', 'UserGuide.html', 'User Guide') li.nav-item =nav_link('DeveloperGuide', 'DeveloperGuide.html', 'Developer Guide') - - if attr? 'site-seedu' + - if attr? 'site-draganddrop' li.nav-item =nav_link('LearningOutcomes', 'LearningOutcomes.html', 'LOs') li.nav-item diff --git a/docs/theme.yml b/docs/theme.yml new file mode 100644 index 00000000000..c9a03b976c7 --- /dev/null +++ b/docs/theme.yml @@ -0,0 +1,5 @@ +extends: default +image: + align: center +caption: + align: center diff --git a/docs/tutorials/AddRemark.adoc b/docs/tutorials/AddRemark.adoc deleted file mode 100644 index 51044c36494..00000000000 --- a/docs/tutorials/AddRemark.adoc +++ /dev/null @@ -1,425 +0,0 @@ -= Tutorial - Adding a new Command -:toc: macro -:site-section: DeveloperGuide -:imagesDir: ../images/add-remark -:stylesDir: ../stylesheets -:xrefstyle: full -ifdef::env-github[] -:tip-caption: :bulb: -:note-caption: :information_source: -:warning-caption: :warning: -endif::[] - -toc::[] - -== Introduction - -In this tutorial, we'll walk you through the implementation of a new command -- `remark`. - -This command allows users of the AddressBook application to add optional remarks to people in their address book and edit it if required. -The command should have the format of `remark INDEX r/REMARK`. -An example of the command is `remark 2 r/Likes baseball`. - -We'll assume that you have already set up the development environment as outlined in the Developer's Guide. - -== Create a new `remark` command - -Looking in the `logic.command` package, you will notice that each existing command have their own class. -All the commands inherit from the abstract class `Command` which means that they must override `execute()`. -Each `Command` returns an instance of `CommandResult` upon success and `CommandResult#feedbackToUser` is printed to the `ResultDisplay`. - -Let's start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory. - -For now, let's keep `RemarkCommand` as simple as possible and print some output. -We accomplish that by returning a `CommandResult` with an accompanying message. - -.RemarkCommand.java -[source, java] ----- -package seedu.address.logic.commands; - -import seedu.address.model.Model; - -/** - * Changes the remark of an existing person in the address book. - */ -public class RemarkCommand extends Command { - - public static final String COMMAND_WORD = "remark"; - - @Override - public CommandResult execute(Model model) { - return new CommandResult("Hello from remark"); - } -} ----- - -=== Hook `RemarkCommand` into the application - -Now that we have our `RemarkCommand` ready to be executed, we need to update `AddressBookParser#parseCommand()` to recognize the `remark` keyword. -Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`. - -You can refer to the changes in this link:https://github.com/nus-cs2103-AY1920S1/addressbook-level3/commit/7d04e49e364dad661cd88f462f01923fba972d2c#diff-5338391f3f6fbb4022c44add6590b74f[diff]. - -=== Run the application - -Run `Main#main` and try out your new `RemarkCommand`. -If everything went well, you should see something like this: - -.Output displayed -image::RemarkHello.png[] - -== Change `RemarkCommand` to throw an exception - -While we have successfully printed a message to `ResultDisplay`, the command does not do what it is supposed to do. -Let's change the command to throw an `CommandException` to accurately reflect that our command is still a work in progress. - -.The relationship between RemarkCommand and Command -image::CommandInterface.png[] - -Following the convention in other commands, we add relevant messages as constants and use them. - -.RemarkCommand.java -[source, java] ----- - public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the remark of the person identified " - + "by the index number used in the last person listing. " - + "Existing remark will be overwritten by the input.\n" - + "Parameters: INDEX (must be a positive integer) " - + "r/ [REMARK]\n" - + "Example: " + COMMAND_WORD + " 1 " - + "r/ Likes to swim."; - - public static final String MESSAGE_NOT_IMPLEMENTED_YET = "Remark command not implemented yet"; - - @Override - public CommandResult execute(Model model) throws CommandException { - throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET); - } ----- - -== Enhancing `RemarkCommand` - -Let's change `RemarkCommand` to parse input from the user. - -=== Make the command accept parameters - -We start by modifying the constructor of `RemarkCommand` to accept an `Index` and a `String`. -While we are at it, let's change the error message to echo the values. -While this is not a replacement for tests, it is an obvious way to tell if our code is functioning as intended. - -[source, java] ----- -import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; -//... -public class RemarkCommand extends Command { - //... - public static final String MESSAGE_ARGUMENTS = "Index: %1$d, Remark: %2$s"; - - private final Index index; - private final String remark; - - /** - * @param index of the person in the filtered person list to edit the remark - * @param remark of the person to be updated to - */ - public RemarkCommand(Index index, String remark) { - requireAllNonNull(index, remark); - - this.index = index; - this.remark = remark; - } - @Override - public CommandResult execute(Model model) throws CommandException { - throw new CommandException(String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark)); - } - - @Override - public boolean equals(Object other) { - // short circuit if same object - if (other == this) { - return true; - } - - // instanceof handles nulls - if (!(other instanceof RemarkCommand)) { - return false; - } - - // state check - RemarkCommand e = (RemarkCommand) other; - return index.equals(e.index) - && remark.equals(e.remark); - } -} ----- - -Your code should look something like link:https://github.com/nus-cs2103-AY1920S1/addressbook-level3/commit/83dd9e6b03d6b83199ceb6f3b66166483155abed#diff-34ace715a8a8d2e5a66e71289f017b47[this] after you are done. - -=== Parse user input - -Now let's move on to writing a parser that will extract the index and remark from the input provided by the user. - -Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. -The class must extend the `Parser` interface. - -.The relationship between Parser and RemarkCommandParser -image::ParserInterface.png[] - -Thankfully, `ArgumentTokenizer#tokenize()` makes it trivial to parse user input. -Let's take a look at the JavaDoc provided for the function to understand what it does. - -[source, java] -.ArgumentTokenizer.java ----- -/** - * Tokenizes an arguments string and returns an {@code ArgumentMultimap} - * object that maps prefixes to their respective argument values. Only the - * given prefixes will be recognized in the arguments string. - * - * @param argsString Arguments string of the form: - * {@code preamble value value ...} - * @param prefixes Prefixes to tokenize the arguments string with - * @return ArgumentMultimap object that maps prefixes to their - * arguments - */ ----- - -We can tell `ArgumentTokenizer#tokenize()` to look out for our new prefix `r/` and it will return us an instance of `ArgumentMultimap`. -Now let's find out what we need to do in order to obtain the Index and String that we need. -Let's look through `ArgumentMultimap` : - -[source, java] -.ArgumentMultimap.java ----- -/** - * Returns the last value of {@code prefix}. - */ -public Optional getValue(Prefix prefix) { - List values = getAllValues(prefix); - return values.isEmpty() ? Optional.empty() : - Optional.of(values.get(values.size() - 1)); -} ----- - -This appears to be what we need to get a String of the remark. -But what about the Index? Taking a quick peek at existing an `Command`... - -[source, java] -.DeleteCommandParser.java ----- -Index index = ParserUtil.parseIndex(args); -return new DeleteCommand(index); ----- - -There appears to be another utility class that obtains an `Index` from the input provided by the user. - -Now that we have the know-how to extract the data that we need from the user's input, we can create a new instance of `RemarkCommand`. - -[source, java] -.RemarkCommandParser.java ----- -public RemarkCommand parse(String args) throws ParseException { - requireNonNull(args); - ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, - PREFIX_REMARK); - - Index index; - try { - index = ParserUtil.parseIndex(argMultimap.getPreamble()); - } catch (IllegalValueException ive) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, - RemarkCommand.MESSAGE_USAGE), ive); - } - - String remark = argMultimap.getValue(PREFIX_REMARK).orElse(""); - - return new RemarkCommand(index, remark); -} ----- - -NOTE: Don't forget to update `AddressBookParser` to use our new `RemarkCommandParser`! - -If you are stuck, check out the sample link:https://github.com/nus-cs2103-AY1920S1/addressbook-level3/commit/efdcdf0e80cec9489f7b47e3f65824f4688ad8f7#diff-fc19ecee89c3732a62fbc8c840250508[here]. - -== Add `Remark` to the model - -Now that we have all the information that we need, let's lay the groundwork for some _persistent_ changes. -We achieve that by working with the `Person` model. -Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person's name). -That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person. - -=== Add a new `Remark` class - -Create a new `Remark` in `seedu.address.model.person`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code. - -A copy-paste and search-replace later, you should have something like link:https://github.com/nus-cs2103-AY1920S1/addressbook-level3/commit/b7a47c50c8e5f0430d343a23d2863446b6ce9298#diff-af2f075d24dfcd333876f0fbce321f25[this]. -Note how `Remark` has no constrains and thus does not require input validation. - -=== Make use of `Remark` - -Let's change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. -These should be relatively simple changes. - -== Add a placeholder element for remark to the UI - -Without getting too deep into `fxml`, let's go on a 5 minute adventure to get some placeholder text to show up for each person. - -Simply add -[source, java] -.PersonCard.java -``` -@FXML -private Label remark; -``` - -to link:https://github.com/nus-cs2103-AY1920S1/addressbook-level3/commit/2758455583f0101ed918a318fc75679270843a0d#diff-0c6b6abcfac8c205e075294f25e851fe[`seedu.address.ui.PersonCard`]. -`@FXML` is an annotation that marks a private or protected field and makes it accessible to FXML. -It might sound like Greek to you right now, don't worry -- we will get back to it later. - -Then insert - -``` -