# nicholoasng72606-wq/j_29 architecture

> Architecture diagram of the GitHub repository nicholoasng72606-wq/j_29, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/nicholoasng72606-wq/j_29
- Repository: https://github.com/nicholoasng72606-wq/j_29

## Overview

JUPAS Calculator turns student subject grades into programme-specific admission-score estimates and chance labels for four universities. The browser workflow loads programme and category data, converts entered grades, dispatches calculations to each university’s formula module, then filters and displays results against admission figures. Students can search, filter categories or favourites, save scores and favourites in browser storage, and print. The sampled source shows these runtime paths; PDF output is documented as a print/save workflow, while markup and style were not sampled.

Main entry points: [`main.js`](https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js) (Calculator UI), [`common.js`](https://github.com/nicholoasng72606-wq/j_29/blob/main/common.js) (Chance & Utilities), [`CUHK/CUHK.js`](https://github.com/nicholoasng72606-wq/j_29/blob/main/CUHK/CUHK.js) (CUHK Formulas), [`HKU/HKU.js`](https://github.com/nicholoasng72606-wq/j_29/blob/main/HKU/HKU.js) (HKU Formulas)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_inputs["Student Inputs"]
  node_app["Calculator UI<br/>[main.js]"]
end

subgraph group_calculation["Score Calculation"]
  node_grades["Grade Conversion<br/>[common.js]"]
  node_cuhk["CUHK Formulas<br/>[CUHK.js]"]
  node_hku["HKU Formulas<br/>[HKU.js]"]
  node_hkust["HKUST Formulas<br/>[HKUST.js]"]
  node_polyu["PolyU Formulas<br/>[PolyU.js]"]
  node_chance["Chance &amp; Utilities<br/>[common.js]"]
end

subgraph group_results["Programme Results"]
  node_programme_data["Programme Data<br/>[CUHK.json]"]
  node_category_data["Category Map<br/>[cat.json]"]
  node_results_table["Results Table<br/>[main.js]"]
  node_filters["Search &amp; Filters<br/>[main.js]"]
  node_score_bar["Score Comparison Bar<br/>[main.js]"]
  node_print["Print / PDF<br/>[main.js]"]
end

subgraph group_persistence["Browser Persistence"]
  node_browser_storage[("Browser Storage")]
end

node_student(("Student"))

node_student -->|"enters grades"| node_app
node_app -->|"converts grades"| node_grades
node_app -->|"fetches data"| node_programme_data
node_app -->|"fetches mapping"| node_category_data
node_app -->|"dispatches scores"| node_cuhk
node_app -->|"dispatches scores"| node_hku
node_app -->|"dispatches scores"| node_hkust
node_app -->|"dispatches scores"| node_polyu
node_cuhk -->|"uses chance rules"| node_chance
node_hku -->|"uses chance rules"| node_chance
node_hkust -->|"uses scoring helpers"| node_chance
node_polyu -->|"uses chance rules"| node_chance
node_app -->|"reads and writes"| node_browser_storage
node_app -->|"renders results"| node_results_table
node_app -->|"applies filters"| node_filters
node_app -->|"renders comparisons"| node_score_bar
node_student -->|"searches and selects"| node_filters
node_student -->|"requests print"| node_print

click node_app "https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js"
click node_grades "https://github.com/nicholoasng72606-wq/j_29/blob/main/common.js"
click node_cuhk "https://github.com/nicholoasng72606-wq/j_29/blob/main/CUHK/CUHK.js"
click node_hku "https://github.com/nicholoasng72606-wq/j_29/blob/main/HKU/HKU.js"
click node_hkust "https://github.com/nicholoasng72606-wq/j_29/blob/main/HKUST/HKUST.js"
click node_polyu "https://github.com/nicholoasng72606-wq/j_29/blob/main/PolyU/PolyU.js"
click node_chance "https://github.com/nicholoasng72606-wq/j_29/blob/main/common.js"
click node_programme_data "https://github.com/nicholoasng72606-wq/j_29/blob/main/CUHK/CUHK.json"
click node_category_data "https://github.com/nicholoasng72606-wq/j_29/blob/main/cat.json"
click node_results_table "https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js"
click node_filters "https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js"
click node_score_bar "https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js"
click node_print "https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app toneBlue
class node_grades,node_cuhk,node_hku,node_hkust,node_polyu,node_chance toneAmber
class node_programme_data,node_category_data,node_results_table,node_filters,node_score_bar,node_print toneMint
class node_browser_storage toneRose
class node_student toneIndigo
```

## Components

### Student Inputs

- [Calculator UI](https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js): `main.js`

### Score Calculation

- [Grade Conversion](https://github.com/nicholoasng72606-wq/j_29/blob/main/common.js): `common.js`
- [CUHK Formulas](https://github.com/nicholoasng72606-wq/j_29/blob/main/CUHK/CUHK.js): `CUHK/CUHK.js`
- [HKU Formulas](https://github.com/nicholoasng72606-wq/j_29/blob/main/HKU/HKU.js): `HKU/HKU.js`
- [HKUST Formulas](https://github.com/nicholoasng72606-wq/j_29/blob/main/HKUST/HKUST.js): `HKUST/HKUST.js`
- [PolyU Formulas](https://github.com/nicholoasng72606-wq/j_29/blob/main/PolyU/PolyU.js): `PolyU/PolyU.js`
- [Chance & Utilities](https://github.com/nicholoasng72606-wq/j_29/blob/main/common.js): `common.js`

### Programme Results

- [Programme Data](https://github.com/nicholoasng72606-wq/j_29/blob/main/CUHK/CUHK.json): `CUHK/CUHK.json`
- [Category Map](https://github.com/nicholoasng72606-wq/j_29/blob/main/cat.json): `cat.json`
- [Results Table](https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js): `main.js`
- [Search & Filters](https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js): `main.js`
- [Score Comparison Bar](https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js): `main.js`
- [Print / PDF](https://github.com/nicholoasng72606-wq/j_29/blob/main/main.js): `main.js`

### Browser Persistence

- **Browser Storage**

### Other components

- **Student**

## Connections

- Student → Calculator UI: enters grades (evidence: `README.md`)
- Calculator UI → Grade Conversion: converts grades (evidence: `main.js`)
- Calculator UI → Programme Data: fetches data (evidence: `main.js`)
- Calculator UI → Category Map: fetches mapping (evidence: `main.js`)
- Calculator UI → CUHK Formulas: dispatches scores (evidence: `main.js`)
- Calculator UI → HKU Formulas: dispatches scores (evidence: `main.js`)
- Calculator UI → HKUST Formulas: dispatches scores (evidence: `main.js`)
- Calculator UI → PolyU Formulas: dispatches scores (evidence: `main.js`)
- CUHK Formulas → Chance & Utilities: uses chance rules (evidence: `CUHK/CUHK.js`)
- HKU Formulas → Chance & Utilities: uses chance rules (evidence: `HKU/HKU.js`)
- HKUST Formulas → Chance & Utilities: uses scoring helpers (evidence: `HKUST/HKUST.js`)
- PolyU Formulas → Chance & Utilities: uses chance rules (evidence: `PolyU/PolyU.js`)
- Calculator UI → Browser Storage: reads and writes (evidence: `main.js`)
- Calculator UI → Results Table: renders results (evidence: `main.js`)
- Calculator UI → Search & Filters: applies filters (evidence: `main.js`)
- Calculator UI → Score Comparison Bar: renders comparisons (evidence: `main.js`)
- Student → Search & Filters: searches and selects (evidence: `README.md`)
- Student → Print / PDF: requests print (evidence: `README.md`)
