diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 00000000000..e18212b18db
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,25 @@
+name: MarkBind Action
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ build_and_deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Install Graphviz
+ run: sudo apt-get install graphviz
+ - name: Install Java
+ uses: actions/setup-java@v3
+ with:
+ java-version: '17'
+ distribution: 'zulu'
+ - name: Build & Deploy MarkBind site
+ uses: MarkBind/markbind-action@v2
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ rootDirectory: './docs'
+ baseUrl: '/tp' # assuming your repo name is tp
+ version: '^6.0.2'
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index 3f454a0be30..2c4954f7622 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -13,14 +13,6 @@ jobs:
- name: Set up repository
uses: actions/checkout@main
- - name: Set up repository
- uses: actions/checkout@main
- with:
- ref: master
-
- - name: Merge to master
- run: git checkout --progress --force ${{ github.sha }}
-
- name: Run repository-wide tests
if: runner.os == 'Linux'
working-directory: ${{ github.workspace }}/.github
diff --git a/.gitignore b/.gitignore
index 284c4ca7cd9..59be7c96c12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,11 @@ src/test/data/sandbox/
# MacOS custom attributes files created by Finder
.DS_Store
docs/_site/
+docs/_markbind/logs/
+
+# Release bundles (too large for git)
+release/
+*.zip
+**/javafx/lib/
+
+data/fitbook.json
diff --git a/README.md b/README.md
index 16208adb9b6..33e7598068c 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,29 @@
-[](https://github.com/se-edu/addressbook-level3/actions)
+[](https://github.com/AY2526S1-CS2103T-F09-4/tp/actions)

-* This is **a sample project for Software Engineering (SE) students**.
+# FitBook
+
+* This is **FitBook**
Example usages:
- * as a starting point of a course project (as opposed to writing everything from scratch)
- * as a case study
-* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.
- * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.
+ * as a starting point of a course project (instead of building everything from scratch)
+ * as a case study in software engineering
+
+* This is an ongoing software project for a desktop application (called _FitBook_) used by **personal trainers** for managing their clients' information.
+ * It is **written in OOP fashion**. It provides a **reasonably well-written** code base (around 6 KLoC) that is larger than what students usually write in beginner-level SE modules, while still being approachable.
* It comes with a **reasonable level of user and developer documentation**.
-* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).
-* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.
+
+* FitBook is designed for **personal trainers** who need to keep track of:
+ * **Client sessions** – schedule and record training sessions
+ * **Payments** – monitor and log client payments
+ * **Body Statistics** – track progress such as weight, body fat %, and strength levels
+ * **Medical Notes** – record important health considerations to personalize training safely
+
+* It is named `FitBook` because it is an evolution of the `AddressBook` project from the SE-EDU initiative, extended and adapted to the fitness domain.
+
+* For the detailed documentation of the original project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.
+ * While FitBook has diverged in domain and features, it retains the same solid engineering foundations.
+
* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org/#contributing-to-se-edu) for more info.
+
+* FitBook is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).
diff --git a/build.gradle b/build.gradle
index 4326923798c..8b6c315ed82 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,19 +1,34 @@
plugins {
id 'java'
- id 'checkstyle'
- id 'com.github.johnrengelman.shadow' version '7.1.2'
id 'application'
+ id 'checkstyle'
+ id 'com.github.johnrengelman.shadow' version '8.1.1'
id 'jacoco'
+ id 'org.openjfx.javafxplugin' version '0.1.0'
}
-mainClassName = 'seedu.address.Main'
+java {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+}
+
+application {
+ mainClass = 'seedu.address.Main'
+ applicationDefaultJvmArgs = [
+ '--add-modules', 'javafx.base,javafx.graphics,javafx.controls,javafx.fxml'
+ ]
+}
-sourceCompatibility = JavaVersion.VERSION_17
-targetCompatibility = JavaVersion.VERSION_17
+javafx {
+ // 17.x to match JDK 17
+ version = '17.0.7'
+ // modules you actually use:
+ modules = ['javafx.base', 'javafx.graphics', 'javafx.controls', 'javafx.fxml']
+}
repositories {
mavenCentral()
- maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
+ // maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } //remove snapshots
}
checkstyle {
@@ -25,48 +40,54 @@ test {
finalizedBy jacocoTestReport
}
-task coverage(type: JacocoReport) {
- sourceDirectories.from files(sourceSets.main.allSource.srcDirs)
+// Generate HTML + XML coverage after tests
+tasks.register('coverage', JacocoReport) {
+ dependsOn tasks.test
+
+ // where to find the compiled classes and sources
classDirectories.from files(sourceSets.main.output)
- executionData.from files(jacocoTestReport.executionData)
- afterEvaluate {
- classDirectories.from files(classDirectories.files.collect {
- fileTree(dir: it, exclude: ['**/*.jar'])
- })
- }
+ sourceDirectories.from files(sourceSets.main.allSource.srcDirs)
+
+ // pick up exec/ec files from test runs (Gradle 7+ sometimes writes .exec or .ec)
+ executionData.from fileTree(dir: buildDir, includes: [
+ "jacoco/test.exec",
+ "jacoco/test.ec",
+ "outputs/unit_test_code_coverage/*coverage.ec"
+ ])
+
reports {
html.required = true
- xml.required = true
+ xml.required = true
+ csv.required = false
}
}
+
+tasks.withType(JavaExec).configureEach {
+ // defensively add modules in case a custom run task bypasses the plugin config
+ jvmArgs += ['--add-modules', 'javafx.base,javafx.graphics,javafx.controls,javafx.fxml']
+ standardInput = System.in
+}
+
dependencies {
- String jUnitVersion = '5.4.0'
- String javaFxVersion = '17.0.7'
-
- implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win'
- implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac'
- implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'linux'
- implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'win'
- implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'mac'
- implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'linux'
- implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'win'
- implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'mac'
- implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'linux'
- implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win'
- implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac'
- implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux'
-
- implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.7.0'
- implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.7.4'
-
- testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: jUnitVersion
-
- testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: jUnitVersion
+ def jUnitVersion = '5.10.2' // latest stable JUnit 5
+
+ // Use modern Jackson via the official BOM (keeps all versions aligned)
+ implementation platform('com.fasterxml.jackson:jackson-bom:2.17.2')
+ implementation 'com.fasterxml.jackson.core:jackson-databind'
+ implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
+
+ // Unit tests
+ testImplementation "org.junit.jupiter:junit-jupiter-api:${jUnitVersion}"
+ testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${jUnitVersion}"
}
shadowJar {
- archiveFileName = 'addressbook.jar'
+ archiveFileName = 'FitBook.jar'
+}
+
+run {
+ enableAssertions = true
}
defaultTasks 'clean', 'test'
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 00000000000..1748e487fbd
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,23 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+_markbind/logs/
+
+# Dependency directories
+node_modules/
+
+# Production build files (change if you output the build to a different directory)
+_site/
+
+# Env
+.env
+.env.local
+
+# IDE configs
+.vscode/
+.idea/*
+*.iml
diff --git a/docs/AboutUs.md b/docs/AboutUs.md
index ff3f04abd02..72358047685 100644
--- a/docs/AboutUs.md
+++ b/docs/AboutUs.md
@@ -1,58 +1,60 @@
---
-layout: page
-title: About Us
+ layout: default.md
+ title: "About Us"
---
-We are a team based in the [School of Computing, National University of Singapore](https://www.comp.nus.edu.sg).
+# About Us
+
+We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).
You can reach us at the email `seer[at]comp.nus.edu.sg`
## Project team
-### John Doe
+### Eldridge Ng
-
+
-[[homepage](http://www.comp.nus.edu.sg/~damithch)]
-[[github](https://github.com/johndoe)]
+[[homepage](https://ay2526s1-cs2103t-f09-4.github.io/tp/)]
+[[github](https://github.com/eltry42)]
[[portfolio](team/johndoe.md)]
* Role: Project Advisor
-### Jane Doe
+### Harun Abdullah Bin Mohd Jufri
-
+
-[[github](http://github.com/johndoe)]
+[[github](http://github.com/harun-abdullah)]
[[portfolio](team/johndoe.md)]
* Role: Team Lead
* Responsibilities: UI
-### Johnny Doe
+### Arun Ayyappan Vellaiyan
-
+
-[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]
+[[github](http://github.com/ArunV2048)] [[portfolio](team/johndoe.md)]
* Role: Developer
* Responsibilities: Data
-### Jean Doe
+### Adib
-
+
-[[github](http://github.com/johndoe)]
+[[github](http://github.com/adibice1)]
[[portfolio](team/johndoe.md)]
* Role: Developer
* Responsibilities: Dev Ops + Threading
-### James Doe
+### Darius Deng Yang
-
+
-[[github](http://github.com/johndoe)]
+[[github](http://github.com/darisusu)]
[[portfolio](team/johndoe.md)]
* Role: Developer
diff --git a/docs/Configuration.md b/docs/Configuration.md
index 13cf0faea16..32f6255f3b9 100644
--- a/docs/Configuration.md
+++ b/docs/Configuration.md
@@ -1,6 +1,8 @@
---
-layout: page
-title: Configuration guide
+ layout: default.md
+ title: "Configuration guide"
---
+# Configuration guide
+
Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: `config.json`).
diff --git a/docs/DevOps.md b/docs/DevOps.md
index 4724701da81..747f3f9a82d 100644
--- a/docs/DevOps.md
+++ b/docs/DevOps.md
@@ -1,12 +1,15 @@
---
-layout: page
-title: DevOps guide
+ layout: default.md
+ title: "DevOps guide"
+ pageNav: 3
---
-* Table of Contents
-{:toc}
+# DevOps guide
---------------------------------------------------------------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
- * Returns null if there are no matches
- *
- */
- private Level getLoggingLevel(String loggingLevelString) {
- return Level.parse(loggingLevelString);
+ /** Custom serializer for java.nio.file.Path that stores only the filename. */
+ private static class PathSerializer extends com.fasterxml.jackson.databind.ser.std.StdScalarSerializer Earliest deadlines first by default; accepts "desc" to invert.
+ * Scans an argument string for tokens that look like prefixes (letters followed by '/')
+ * appearing at word boundaries, and throws a {@link ParseException} if any such token
+ * is not among the allowed/known prefixes for a command.
+ */
+public final class PrefixGuards {
+ private static final Pattern ANY_PREFIX_PATTERN =
+ Pattern.compile("(?<=\\s|^)([A-Za-z]+/)");
+ private PrefixGuards() {}
+
+
+
+ /**
+ * Ensures the given argument string contains no unknown/typo prefixes.
+ *
+ * @param args the raw arguments string, e.g. {@code "n/John p/123 x/bad"}
+ * @param knownPrefixes a set of allowed prefix lexemes (e.g., {@code "n/", "p/", "e/"}).
+ * @throws ParseException if a token that looks like a prefix is not in {@code knownPrefixes}
+ */
+ public static void ensureNoUnknownPrefixes(String args, Set
+ * Usage: {@code sortbysession}
+ *
+ *
+ * When executed, the command sorts clients by their next upcoming session time
+ * (earliest first), using the current date-time as the reference. Descending order is not supported.
+ */
+public class SortBySessionCommandParser implements Parser