# Full Dashboard Feature Audit Summary

**Goal:** Understand why only a few menus appear in the dashboard UI even though many modules exist.

---

## 1. LIST ALL EXISTING DASHBOARD PAGES

**Sources scanned:** `app/Config/Routes.php`, all `app/Modules/*/Routes.php`, `DashboardPageController`, `DashboardAcademicController`, any controller rendering `layouts/main`.

**Finding:** All dashboard **web** routes are defined in `app/Config/Routes.php` only. No module defines HTML page routes; modules define only API routes.

| # | route | controller | view | required_filter | roles_allowed_if_known |
|---|--------|------------|------|------------------|------------------------|
| 1 | `GET /dashboard` | `DashboardPageController::index` | `dashboard/index` | `dashboard_page_auth` | Any authenticated user |
| 2 | `GET /dashboard/attendance/report/(:num)` | `DashboardPageController::attendanceReport` | `dashboard/attendance_report` | `dashboard_page_auth` | Any authenticated user |
| 3 | `GET /dashboard/schedule/today` | `DashboardPageController::scheduleToday` | `dashboard/schedule_today` | `dashboard_page_auth` | Any authenticated user |
| 4 | `GET /dashboard/academic/schedule-builder/(:num)` | `DashboardAcademicController::scheduleBuilder` | `dashboard/schedule_builder` | `dashboard_admin_page` | **ADMIN only** |

**JSON output (as requested):**

```json
[
  {
    "route": "GET /dashboard",
    "controller": "DashboardPageController::index",
    "view": "dashboard/index",
    "required_filter": "dashboard_page_auth",
    "roles_allowed_if_known": "any authenticated"
  },
  {
    "route": "GET /dashboard/attendance/report/(:num)",
    "controller": "DashboardPageController::attendanceReport",
    "view": "dashboard/attendance_report",
    "required_filter": "dashboard_page_auth",
    "roles_allowed_if_known": "any authenticated"
  },
  {
    "route": "GET /dashboard/schedule/today",
    "controller": "DashboardPageController::scheduleToday",
    "view": "dashboard/schedule_today",
    "required_filter": "dashboard_page_auth",
    "roles_allowed_if_known": "any authenticated"
  },
  {
    "route": "GET /dashboard/academic/schedule-builder/(:num)",
    "controller": "DashboardAcademicController::scheduleBuilder",
    "view": "dashboard/schedule_builder",
    "required_filter": "dashboard_admin_page",
    "roles_allowed_if_known": "ADMIN"
  }
]
```

---

## 2. LIST ALL DASHBOARD API ENDPOINTS

**Sources:** `app/Modules/Dashboard/Routes.php`, `app/Modules/Attendance/Routes.php`, `app/Modules/Academic/Routes.php`, `app/Config/Routes.php` (api/users).  
**Note:** `api/dashboard/*` is protected by global filter `dashboard_auth` in `app/Config/Filters.php` (session required).

### Grouped by feature

**schedules**
- `GET /api/dashboard/schedules/today` — Today's schedules (role-filtered).
- `GET /api/dashboard/schedules/current` — Current lesson or next (role-filtered).
- `GET /api/academic/schedules/class/(:num)` — Weekly schedule grid for class (admin_only).
- `POST /api/academic/schedules/bulk-save` — Bulk save schedules (admin_only).
- `GET /api/academic/lesson-slots` — List lesson slots (admin_only).
- `GET /api/academic/subjects` — List subjects (admin_only).

**attendance**
- `GET /api/dashboard/attendance/progress/current` — Live attendance progress for current schedule.
- `POST /api/attendance/checkin` — Device/mobile check-in (no dashboard filter; used by devices).
- `GET /api/attendance/report/schedule/(:num)` — Schedule report data (used by attendance report page).

**realtime**
- `GET /api/dashboard/summary` — Dashboard summary.
- `GET /api/dashboard/realtime` — Realtime stats.
- `GET /api/dashboard/stream` — SSE stream for live attendance.
- `GET /api/dashboard/devices` — Devices list.

**reports**
- Attendance report page uses: `GET /api/attendance/report/schedule/(:num)` (plus date query). No dedicated “reports” API group.

**devices**
- `GET /api/dashboard/devices` — Used by dashboard UI.
- `POST /api/device/login` — Device auth (not dashboard UI).
- `GET /api/mobile/ping`, `GET /api/mobile/bootstrap` — Mobile (not dashboard UI).

**analytics**
- No dedicated analytics API. Summary/realtime are the closest.

**other (used for dashboard UI)**
- `GET /api/users?role=GURU_MAPEL` — Schedule Builder teacher dropdown (admin_only).

---

## 3. SIDEBAR MENU SOURCE

**Location:** `app/Views/partials/sidebar.php`  
**Included by:** `app/Views/layouts/main.php` via `<?= view('partials/sidebar') ?>`.  
No separate “layouts/sidebar.php”; no config/menu builder found.

### How menu items are added

- **Fully static:** The sidebar is a single PHP file with hardcoded `<a href="...">` links.
- **No config:** No array or config file drives the menu.
- **No role logic:** The same HTML is rendered for every role; there is no `if (user has role X) show link Y`.
- **No dynamic highlighting:** The first item (Dashboard) uses `bg-primary/10 text-primary`; no logic sets “active” by current URI.

### Current sidebar entries

| Order | Label           | href | Notes |
|-------|-----------------|------|--------|
| 1     | Dashboard       | `/dashboard` | Real route. |
| 2     | Daily Schedule  | `/dashboard/schedule/today` | Real route. |
| 3     | Schedule Builder| `/dashboard/academic/schedule-builder/1` | Real route; class ID hardcoded to 1. |
| 4     | Students        | `#` | Placeholder; no page. |
| 5     | Attendance      | `#` | Placeholder; no page. |
| 6     | Devices         | `#` | Placeholder; no page. |

### Why some features are not visible

1. **Attendance Report** — There is a full page (`/dashboard/attendance/report/{id}`) but **no sidebar link**. Users only reach it via “Open Attendance” on the main dashboard (current lesson) or on Daily Schedule (per row). So the feature exists but is not in the menu.
2. **Students, Attendance (list), Devices** — Sidebar shows labels and icons but links are `#`. There are no corresponding dashboard pages or list views in the codebase; only placeholders.
3. **Current Lesson** — Not a separate page; it’s a **card on the main dashboard** plus live progress. No sidebar entry (by design).
4. **Academic setup** — Lesson slots, subjects, schedule management exist as **APIs** (admin_only) and one **page** (Schedule Builder). There is no “Academic Setup” or “Lesson Slots” menu item; only “Schedule Builder” with a fixed class ID.

---

## 4. DETECT MISSING MENU ITEMS

**Comparison:** Existing dashboard pages (Section 1) vs actual sidebar links (Section 3).

| route | feature_name | reason_not_visible |
|-------|--------------|--------------------|
| `GET /dashboard/attendance/report/(:num)` | Attendance Report (per schedule) | No sidebar entry; only reachable via “Open Attendance” on dashboard or daily schedule. |

**Missing menu list (structured):**

```json
[
  {
    "route": "GET /dashboard/attendance/report/(:num)",
    "feature_name": "Attendance Report",
    "reason_not_visible": "Not in sidebar; only linked from Current Lesson card and Daily Schedule row (Open Attendance)."
  }
]
```

**Pages that are in the sidebar:** Dashboard, Daily Schedule, Schedule Builder.  
**Placeholder items (no real route):** Students, Attendance (list), Devices — these are visible in the menu but point to `#` and have no backend page.

---

## 5. ROLE FILTER CHECK

**Filters used on dashboard-related routes:**

| Filter | Purpose | Used on |
|--------|---------|--------|
| `dashboard_page_auth` | Must be logged in (session). No role check. Redirects to `/login` if not authenticated. | `GET /dashboard`, `GET /dashboard/attendance/report/(:num)`, `GET /dashboard/schedule/today` |
| `dashboard_admin_page` | Must be logged in **and** have role **ADMIN**. Otherwise redirect to `/dashboard` with error. | `GET /dashboard/academic/schedule-builder/(:num)` |
| `admin_only` | API filter: must be logged in and ADMIN. Returns 401/403 JSON for API. | All `api/academic/*`, `GET /api/users` |
| `dashboard_auth` | Session required for API. Applied globally to `api/dashboard/*` in `Config/Filters.php`. No role check. | All `api/dashboard/*` |

**Which roles can see which pages:**

- **Dashboard (main), Daily Schedule, Attendance Report:** Any **authenticated** user (any role). Backend may still filter data by role (e.g. schedules by WALI_KELAS, GURU_MAPEL, ORANG_TUA).
- **Schedule Builder:** **ADMIN only.** Others get redirect to `/dashboard` with “Akses hanya untuk Admin.”
- **API:**  
  - `api/dashboard/*`: any authenticated user (data filtered by role in services).  
  - `api/academic/*` and `api/users`: **ADMIN only** (403 if not admin).

The sidebar does **not** hide Schedule Builder for non-admins; a non-admin who clicks it is redirected after the filter runs.

---

## 6. FINAL SUMMARY

### Current dashboard capability level

- **Implemented and reachable from UI:** Main dashboard (realtime + current lesson + live progress), Daily Schedule, Schedule Builder (class 1 hardcoded), Attendance Report (via links only, not menu).
- **Implemented but not exposed in menu:** Attendance Report as a direct menu item; no “list of schedules” or “pick a class” for Schedule Builder.
- **Placeholder only:** Students, Attendance (list), Devices — labels in sidebar but no pages or list views.

### Features implemented but hidden or partially hidden

1. **Attendance Report** — Full page and API exist; no sidebar link. Users must use “Open Attendance” from dashboard or daily schedule.
2. **Schedule Builder** — Only one class (ID 1) linked from sidebar; no class selector or list.
3. **Current Lesson + Live Progress** — On main dashboard only; no separate “Current Lesson” menu (by design).
4. **Academic APIs** — Lesson slots, subjects, schedules CRUD and bulk-save exist for admin; only Schedule Builder page is in the menu.

### Why only a few menus “work”

- **Three items** point to real routes: Dashboard, Daily Schedule, Schedule Builder.
- **One real page** (Attendance Report) has **no** sidebar entry.
- **Three items** (Students, Attendance, Devices) are **placeholders** (`href="#"`) with no backend pages.

So the menu looks like “many” items, but only three are real destinations; one important page is missing from the menu, and three are non-functional placeholders.

### Recommended menu structure for school system

Aligning with your desired structure and current codebase:

| # | Menu label        | Purpose | Current status / suggestion |
|---|-------------------|--------|------------------------------|
| 1 | Dashboard         | Home, current lesson, realtime | Exists. Keep. |
| 2 | Daily Schedule    | Today’s schedules by role | Exists. Keep. |
| 3 | Current Lesson    | — | No separate page; keep as card on Dashboard. Optional: menu item that scrolls to or highlights that card. |
| 4 | Attendance Reports| List or pick schedule → report | Add link: e.g. “Attendance Reports” → new page that lists schedules (or today’s) with “Open Report” per row, or link to a report index. Currently only per-schedule report exists. |
| 5 | Schedule Builder  | Weekly schedule per class | Exists; add class selector or “Schedule Builder” → page that selects class then redirects to `schedule-builder/(:num)`. |
| 6 | Academic Setup    | Lesson slots, subjects, maybe classes | No page yet. Add menu item when you have a page (e.g. lesson slots + subjects management). APIs exist (admin_only). |
| 7 | Devices          | Device list / management | Add when you have a dashboard page for devices. API `GET /api/dashboard/devices` exists. |
| 8 | Analytics        | Future | No implementation; add when built. |

**Concrete next steps (no code change in this audit):**

- Add a **sidebar link** for “Attendance Reports” (e.g. to a report index or today’s schedules with report links).
- Replace **Students**, **Attendance**, **Devices** placeholders: either add real routes and link them or remove/hide until implemented.
- Add **class selection** for Schedule Builder (new page or dropdown) so the menu is not tied to class 1 only.
- Optionally add **Academic Setup** and **Devices** when corresponding pages exist; keep **Analytics** for later.

---

*End of audit. No code was modified.*
