# ricwtk/epman-dashboard architecture

> Architecture diagram of the GitHub repository ricwtk/epman-dashboard, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ricwtk/epman-dashboard
- Repository: https://github.com/ricwtk/epman-dashboard

## Overview

EPMan is a Vue dashboard for managing engineering courses, programmes, programme structures, schools, and user access. The visible workflow begins with authentication and routed dashboard views; course import parses an outline, while course and programme state supports editing and persistence. Course mapping and assessment capabilities are represented by their dedicated components and helpers. The README is a generic Vue/Vite template and documents no product behavior; unsampled view-to-store connections are therefore left out or shown as unverified.

Main entry points: [`src/router/index.ts`](https://github.com/ricwtk/epman-dashboard/blob/main/src/router/index.ts) (Route and access guard), [`src/services/dataService.ts`](https://github.com/ricwtk/epman-dashboard/blob/main/src/services/dataService.ts) (Academic data service), [`src/stores/course.ts`](https://github.com/ricwtk/epman-dashboard/blob/main/src/stores/course.ts) (Course editor state), [`src/stores/auth.ts`](https://github.com/ricwtk/epman-dashboard/blob/main/src/stores/auth.ts) (Authentication state)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application Shell"]
  node_app["Vue application shell<br/>[App.vue]"]
  node_router["Route and access guard<br/>[index.ts]"]
end

subgraph group_identity["Identity and Access"]
  node_login["Login view<br/>[LoginView.vue]"]
  node_auth["Authentication state<br/>[auth.ts]"]
  node_userprofile["User profiles<br/>[userService.ts]"]
  node_admin["User administration<br/>[UserAdminView.vue]"]
end

subgraph group_academics["Academic Management"]
  node_courselist["Course list<br/>[CourseListView.vue]"]
  node_courseview["Course workspace<br/>[CourseView.vue]"]
  node_courseimport["Course import"]
  node_courseeditor["Course editor state<br/>[course.ts]"]
  node_coursecomponents["Course mapping and assessment"]
  node_programmelist["Programme list"]
  node_programmeview["Programme workspace<br/>[ProgrammeView.vue]"]
  node_structuregrid["Programme structure grid<br/>[StructureGrid.vue]"]
  node_schoolviews["School management<br/>[SchoolView.vue]"]
end

subgraph group_persistence["Data and Domain"]
  node_coursemodel["Course model and exports<br/>[course.ts]"]
  node_programmemodel["Programme and structure model<br/>[programme.ts]"]
  node_coursehelpers["Course helpers<br/>[courseHelpers.ts]"]
  node_outlineparser["Outline parser"]
  node_common["Revision and mapping utilities<br/>[common.ts]"]
  node_dataservice["Academic data service<br/>[dataService.ts]"]
  node_firebase["Firebase configuration<br/>[firebase.ts]"]
end

node_user(("Dashboard user"))
node_firestore[("Firestore")]

node_user -.->|"uses"| node_app
node_app -->|"renders routes"| node_router
node_app -.->|"reads sidebar state"| node_auth
node_router -->|"routes to"| node_login
node_router -->|"checks access"| node_auth
node_router -->|"routes to"| node_admin
node_router -->|"routes to"| node_courseimport
node_router -->|"routes to"| node_courseview
node_router -->|"routes to"| node_courselist
node_router -->|"routes to"| node_programmelist
node_router -->|"routes to"| node_programmeview
node_router -->|"routes to"| node_schoolviews
node_login -->|"signs in"| node_auth
node_auth -->|"loads profile"| node_userprofile
node_admin -->|"checks permissions"| node_auth
node_courseimport -->|"parses outlines"| node_outlineparser
node_courseimport -->|"updates course state"| node_courseeditor
node_courseimport -->|"uses data service"| node_dataservice
node_coursecomponents -->|"uses course state"| node_courseeditor
node_coursecomponents -->|"uses mapping helpers"| node_coursehelpers
node_structuregrid -->|"uses data service"| node_dataservice
node_structuregrid -->|"uses course helpers"| node_coursehelpers
node_courseeditor -->|"persists courses"| node_dataservice
node_courseeditor -->|"creates course data"| node_coursehelpers
node_coursehelpers -->|"uses utilities"| node_common
node_dataservice -->|"uses configuration"| node_firebase
node_dataservice -->|"reads and writes"| node_firestore
node_dataservice -->|"uses course type"| node_coursemodel
node_dataservice -->|"uses programme type"| node_programmemodel
node_outlineparser -->|"produces course data"| node_coursemodel
node_courseeditor -->|"edits course data"| node_coursemodel

click node_app "https://github.com/ricwtk/epman-dashboard/blob/main/src/App.vue"
click node_router "https://github.com/ricwtk/epman-dashboard/blob/main/src/router/index.ts"
click node_login "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/LoginView.vue"
click node_auth "https://github.com/ricwtk/epman-dashboard/blob/main/src/stores/auth.ts"
click node_userprofile "https://github.com/ricwtk/epman-dashboard/blob/main/src/services/userService.ts"
click node_admin "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/UserAdminView.vue"
click node_courselist "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/CourseListView.vue"
click node_courseview "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/CourseView.vue"
click node_courseimport "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/CourseImportView.vue"
click node_courseeditor "https://github.com/ricwtk/epman-dashboard/blob/main/src/stores/course.ts"
click node_coursecomponents "https://github.com/ricwtk/epman-dashboard/blob/main/src/components/course/CEPCEAImplementation.vue"
click node_programmelist "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/ProgrammeListView.vue"
click node_programmeview "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/ProgrammeView.vue"
click node_structuregrid "https://github.com/ricwtk/epman-dashboard/blob/main/src/components/programme/StructureGrid.vue"
click node_schoolviews "https://github.com/ricwtk/epman-dashboard/blob/main/src/views/SchoolView.vue"
click node_coursemodel "https://github.com/ricwtk/epman-dashboard/blob/main/src/types/course.ts"
click node_programmemodel "https://github.com/ricwtk/epman-dashboard/blob/main/src/types/programme.ts"
click node_coursehelpers "https://github.com/ricwtk/epman-dashboard/blob/main/src/utils/courseHelpers.ts"
click node_outlineparser "https://github.com/ricwtk/epman-dashboard/blob/main/src/utils/parseCourseOutline.ts"
click node_common "https://github.com/ricwtk/epman-dashboard/blob/main/src/utils/common.ts"
click node_dataservice "https://github.com/ricwtk/epman-dashboard/blob/main/src/services/dataService.ts"
click node_firebase "https://github.com/ricwtk/epman-dashboard/blob/main/src/services/firebase.ts"

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,node_router,node_user toneBlue
class node_login,node_auth,node_userprofile,node_admin,node_firestore toneAmber
class node_courselist,node_courseview,node_courseimport,node_courseeditor,node_coursecomponents,node_programmelist,node_programmeview,node_structuregrid,node_schoolviews toneMint
class node_coursemodel,node_programmemodel,node_coursehelpers,node_outlineparser,node_common,node_dataservice,node_firebase toneRose
```

## Components

### Application Shell

- [Vue application shell](https://github.com/ricwtk/epman-dashboard/blob/main/src/App.vue): `src/App.vue`
- [Route and access guard](https://github.com/ricwtk/epman-dashboard/blob/main/src/router/index.ts): `src/router/index.ts`

### Identity and Access

- [Login view](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/LoginView.vue): `src/views/LoginView.vue`
- [Authentication state](https://github.com/ricwtk/epman-dashboard/blob/main/src/stores/auth.ts): `src/stores/auth.ts`
- [User profiles](https://github.com/ricwtk/epman-dashboard/blob/main/src/services/userService.ts): `src/services/userService.ts`
- [User administration](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/UserAdminView.vue): `src/views/UserAdminView.vue`

### Academic Management

- [Course list](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/CourseListView.vue): `src/views/CourseListView.vue`
- [Course workspace](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/CourseView.vue): `src/views/CourseView.vue`
- [Course import](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/CourseImportView.vue): `src/views/CourseImportView.vue`
- [Course editor state](https://github.com/ricwtk/epman-dashboard/blob/main/src/stores/course.ts): `src/stores/course.ts`
- [Course mapping and assessment](https://github.com/ricwtk/epman-dashboard/blob/main/src/components/course/CEPCEAImplementation.vue): `src/components/course/CEPCEAImplementation.vue`
- [Programme list](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/ProgrammeListView.vue): `src/views/ProgrammeListView.vue`
- [Programme workspace](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/ProgrammeView.vue): `src/views/ProgrammeView.vue`
- [Programme structure grid](https://github.com/ricwtk/epman-dashboard/blob/main/src/components/programme/StructureGrid.vue): `src/components/programme/StructureGrid.vue`
- [School management](https://github.com/ricwtk/epman-dashboard/blob/main/src/views/SchoolView.vue): `src/views/SchoolView.vue`

### Data and Domain

- [Course model and exports](https://github.com/ricwtk/epman-dashboard/blob/main/src/types/course.ts): `src/types/course.ts`
- [Programme and structure model](https://github.com/ricwtk/epman-dashboard/blob/main/src/types/programme.ts): `src/types/programme.ts`
- [Course helpers](https://github.com/ricwtk/epman-dashboard/blob/main/src/utils/courseHelpers.ts): `src/utils/courseHelpers.ts`
- [Outline parser](https://github.com/ricwtk/epman-dashboard/blob/main/src/utils/parseCourseOutline.ts): `src/utils/parseCourseOutline.ts`
- [Revision and mapping utilities](https://github.com/ricwtk/epman-dashboard/blob/main/src/utils/common.ts): `src/utils/common.ts`
- [Academic data service](https://github.com/ricwtk/epman-dashboard/blob/main/src/services/dataService.ts): `src/services/dataService.ts`
- [Firebase configuration](https://github.com/ricwtk/epman-dashboard/blob/main/src/services/firebase.ts): `src/services/firebase.ts`

### Other components

- **Dashboard user**
- **Firestore**

## Connections

- Dashboard user → Vue application shell: uses
- Vue application shell → Route and access guard: renders routes (evidence: `src/main.ts`)
- Vue application shell → Authentication state: reads sidebar state
- Route and access guard → Login view: routes to (evidence: `src/router/index.ts`)
- Route and access guard → Authentication state: checks access (evidence: `src/router/index.ts`)
- Route and access guard → User administration: routes to (evidence: `src/router/index.ts`)
- Route and access guard → Course import: routes to (evidence: `src/router/index.ts`)
- Route and access guard → Course workspace: routes to (evidence: `src/router/index.ts`)
- Route and access guard → Course list: routes to (evidence: `src/router/index.ts`)
- Route and access guard → Programme list: routes to (evidence: `src/router/index.ts`)
- Route and access guard → Programme workspace: routes to (evidence: `src/router/index.ts`)
- Route and access guard → School management: routes to (evidence: `src/router/index.ts`)
- Login view → Authentication state: signs in (evidence: `src/views/LoginView.vue`)
- Authentication state → User profiles: loads profile (evidence: `src/stores/auth.ts`)
- User administration → Authentication state: checks permissions (evidence: `src/views/UserAdminView.vue`)
- Course import → Outline parser: parses outlines (evidence: `src/views/CourseImportView.vue`)
- Course import → Course editor state: updates course state (evidence: `src/views/CourseImportView.vue`)
- Course import → Academic data service: uses data service (evidence: `src/views/CourseImportView.vue`)
- Course mapping and assessment → Course editor state: uses course state (evidence: `src/components/course/CEPCEAImplementation.vue`)
- Course mapping and assessment → Course helpers: uses mapping helpers (evidence: `src/components/course/CEPCEAImplementation.vue`)
- Programme structure grid → Academic data service: uses data service (evidence: `src/components/programme/StructureGrid.vue`)
- Programme structure grid → Course helpers: uses course helpers (evidence: `src/components/programme/StructureGrid.vue`)
- Course editor state → Academic data service: persists courses (evidence: `src/stores/course.ts`)
- Course editor state → Course helpers: creates course data (evidence: `src/stores/course.ts`)
- Course helpers → Revision and mapping utilities: uses utilities (evidence: `src/utils/courseHelpers.ts`)
- Academic data service → Firebase configuration: uses configuration (evidence: `src/services/dataService.ts`)
- Academic data service → Firestore: reads and writes (evidence: `src/services/dataService.ts`)
- Academic data service → Course model and exports: uses course type (evidence: `src/services/dataService.ts`)
- Academic data service → Programme and structure model: uses programme type (evidence: `src/services/dataService.ts`)
- Outline parser → Course model and exports: produces course data (evidence: `src/utils/parseCourseOutline.ts`)
- Course editor state → Course model and exports: edits course data (evidence: `src/stores/course.ts`)
