Files
presensi/DASHBOARD_FEATURE_AUDIT.md
2026-03-05 14:37:36 +07:00

228 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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; its 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 | Todays 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 todays) 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 todays 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.*