From 5d2c05591296e4504a995498e39a503447629f69 Mon Sep 17 00:00:00 2001 From: Khantey Long Date: Wed, 1 Jul 2026 14:48:45 +0700 Subject: [PATCH] fix bugs --- .../Controllers/Api/DashboardController.php | 21 - dashboard/app/Services/DashboardService.php | 57 ++- dashboard/config/app.php | 4 +- dashboard/public/js/dashboard/export.js | 49 ++- .../js/dashboard/{charts.js => globals.js} | 165 +++++++- dashboard/public/js/globals.js | 59 --- dashboard/public/js/overview.js | 400 +++++------------- dashboard/public/js/program.js | 99 ++--- dashboard/public/js/sequencing.js | 12 +- .../views/auth/forgot-password.blade.php | 2 +- .../resources/views/auth/login.blade.php | 4 +- .../resources/views/layouts/app.blade.php | 37 +- 12 files changed, 412 insertions(+), 497 deletions(-) rename dashboard/public/js/dashboard/{charts.js => globals.js} (70%) delete mode 100644 dashboard/public/js/globals.js diff --git a/dashboard/app/Http/Controllers/Api/DashboardController.php b/dashboard/app/Http/Controllers/Api/DashboardController.php index 4f40631..4d57cf9 100644 --- a/dashboard/app/Http/Controllers/Api/DashboardController.php +++ b/dashboard/app/Http/Controllers/Api/DashboardController.php @@ -234,27 +234,6 @@ class DashboardController extends Controller } - - - - /* - |-------------------------------------------------------------------------- - | Sentinel Map - |-------------------------------------------------------------------------- - */ - - // public function sentinelMap(Request $request) - - // { - // $range = $this->getEpiRange($request); - - // if (!$range) { - // return response()->json(['error' => 'Missing epiweek range'], 400); - // } - - // return response()->json($data); - // } - public function fetchSourceData() { try { diff --git a/dashboard/app/Services/DashboardService.php b/dashboard/app/Services/DashboardService.php index ce8fa74..502e3e4 100644 --- a/dashboard/app/Services/DashboardService.php +++ b/dashboard/app/Services/DashboardService.php @@ -28,9 +28,6 @@ class DashboardService public function summaryCards() { - $programs = Surveillance::orderBy('id')->get(); - $results = []; - $today = date('Y-m-d'); $currentFrom = date('Y-m-d', strtotime('-6 days')); @@ -39,15 +36,23 @@ class DashboardService $prevFrom = date('Y-m-d', strtotime('-13 days')); $prevTo = date('Y-m-d', strtotime('-7 days')); + $results = []; + + $programs = Surveillance::where('id', '!=', 6) + ->orderBy('id') + ->get(); + foreach ($programs as $program) { $current = SurveillanceCase::where('surveillance_id', $program->id) ->whereBetween('case_date', [$currentFrom, $currentTo]) - ->count(); + ->distinct('lab_code') + ->count('lab_code'); $previous = SurveillanceCase::where('surveillance_id', $program->id) ->whereBetween('case_date', [$prevFrom, $prevTo]) - ->count(); + ->distinct('lab_code') + ->count('lab_code'); $percentChange = $previous > 0 ? round((($current - $previous) / $previous) * 100, 1) @@ -62,6 +67,44 @@ class DashboardService ]; } + /* + |-------------------------------------------------------------------------- + | A/H5N1 Summary Card + |-------------------------------------------------------------------------- + */ + + $h5n1Current = SurveillanceCase::join('case_lab_results', function ($join) { + $join->on('surveillance_cases.lab_code', '=', 'case_lab_results.lab_code') + ->on('surveillance_cases.surveillance_id', '=', 'case_lab_results.surveillance_id'); + }) + ->whereBetween('surveillance_cases.case_date', [$currentFrom, $currentTo]) + ->where('case_lab_results.subtype', 'A/H5N1') + ->where('surveillance_cases.surveillance_id', '!=', 6) + ->distinct('surveillance_cases.lab_code') + ->count('surveillance_cases.lab_code'); + + $h5n1Previous = SurveillanceCase::join('case_lab_results', function ($join) { + $join->on('surveillance_cases.lab_code', '=', 'case_lab_results.lab_code') + ->on('surveillance_cases.surveillance_id', '=', 'case_lab_results.surveillance_id'); + }) + ->whereBetween('surveillance_cases.case_date', [$prevFrom, $prevTo]) + ->where('case_lab_results.subtype', 'A/H5N1') + ->where('surveillance_cases.surveillance_id', '!=', 6) + ->distinct('surveillance_cases.lab_code') + ->count('surveillance_cases.lab_code'); + + $h5n1Percent = $h5n1Previous > 0 + ? round((($h5n1Current - $h5n1Previous) / $h5n1Previous) * 100, 1) + : ($h5n1Current > 0 ? 100 : 0); + + $results[] = [ + 'surveillance_id' => null, + 'code' => 'H5N1', + 'current_total' => $h5n1Current, + 'previous_total' => $h5n1Previous, + 'percent_change' => $h5n1Percent + ]; + return $results; } @@ -101,8 +144,8 @@ class DashboardService AND week_data >= ? ) )", - [$startYear, $startYear, $startWeek] - ) + [$startYear, $startYear, $startWeek] + ) ->whereRaw( "(year_data < ? diff --git a/dashboard/config/app.php b/dashboard/config/app.php index a647034..64777ac 100644 --- a/dashboard/config/app.php +++ b/dashboard/config/app.php @@ -13,7 +13,7 @@ return [ | */ - 'name' => env('APP_NAME', 'Laravel'), + 'name' => env('APP_NAME', 'NRML Dashboard'), 'lookback_days' => [ 'SARI' => 30, @@ -61,7 +61,7 @@ return [ | */ - 'url' => env('APP_URL', 'http://localhost'), + 'url' => env('APP_URL', 'http://localhost:8000'), /* |-------------------------------------------------------------------------- diff --git a/dashboard/public/js/dashboard/export.js b/dashboard/public/js/dashboard/export.js index 6fe4b37..c253b21 100644 --- a/dashboard/public/js/dashboard/export.js +++ b/dashboard/public/js/dashboard/export.js @@ -1,9 +1,16 @@ +import * as Charts from "./globals.js"; + + document.addEventListener("DOMContentLoaded", () => { + document + .getElementById('chartSelectorBtn') + ?.addEventListener('click', openChartSelector); const toggle = document.getElementById("exportToggle"); const items = document.getElementById("exportItems"); const close = document.getElementById("exportClose"); + if (!toggle || !items) return; toggle.addEventListener("click", () => { @@ -20,12 +27,31 @@ document.addEventListener("DOMContentLoaded", () => { toggle.innerText = "Export ▸"; }); } + document + .getElementById('btnCharts') + ?.addEventListener('click', openChartSelector); + + document + .getElementById('btnExport') + ?.addEventListener('click', exportFullDashboard); + + + document + .querySelector('#chartCancel') + ?.addEventListener('click', closeChartSelector); + + document + .querySelector('#chartDownload') + ?.addEventListener('click', exportSelectedCharts); + + }); + function openChartSelector() { - if (typeof charts === "undefined" || Object.keys(charts).length === 0) { + if (typeof Charts.charts === "undefined" || Object.keys(Charts.charts).length === 0) { alert("Charts are still loading. Please try again."); return; } @@ -35,7 +61,7 @@ function openChartSelector() { list.innerHTML = ""; - Object.keys(charts).forEach(id => { + Object.keys(Charts.charts).forEach(id => { list.innerHTML += `