Update dashboard filters and packet views

This commit is contained in:
sas.fajri
2026-05-07 12:04:09 +07:00
parent da419950ce
commit 11f0d0436e
17 changed files with 1008 additions and 342 deletions

View File

@@ -9,6 +9,7 @@ import (
"log"
"net/http"
"strconv"
"strings"
"time"
)
@@ -26,8 +27,15 @@ type ArrivalsPartial struct {
}
type PatientsPartial struct {
Patients []PatientDetail
IsRange bool
Patients []PatientDetail
IsRange bool
Search string
ProgressStatus string
KpiFilter string
Page int
PageSize int
HasMore bool
NextPage int
}
type PageData struct {
@@ -237,12 +245,84 @@ func Patients(w http.ResponseWriter, r *http.Request) {
http.Error(w, "query error", http.StatusInternalServerError)
return
}
search := strings.TrimSpace(r.URL.Query().Get("search"))
progressStatus := strings.TrimSpace(r.URL.Query().Get("progress_status"))
kpiFilter := strings.TrimSpace(r.URL.Query().Get("kpi_filter"))
if kpiFilter != "" {
filteredByKPI := make([]PatientDetail, 0, len(patients))
for _, p := range patients {
switch kpiFilter {
case "invited":
filteredByKPI = append(filteredByKPI, p)
case "total_staff":
if p.InTime != "" {
filteredByKPI = append(filteredByKPI, p)
}
case "inprogress":
if p.InTime != "" && !p.HasOut {
filteredByKPI = append(filteredByKPI, p)
}
case "checkedout":
if p.HasOut {
filteredByKPI = append(filteredByKPI, p)
}
default:
filteredByKPI = append(filteredByKPI, p)
}
}
patients = filteredByKPI
}
if search != "" || progressStatus != "" {
lowerSearch := strings.ToLower(search)
filtered := make([]PatientDetail, 0, len(patients))
for _, p := range patients {
if progressStatus != "" && p.ProgressStatus != progressStatus {
continue
}
if lowerSearch != "" && !strings.Contains(strings.ToLower(p.Name), lowerSearch) && !strings.Contains(strconv.Itoa(p.ID), lowerSearch) {
continue
}
filtered = append(filtered, p)
}
patients = filtered
}
page := 1
if p, err := strconv.Atoi(strings.TrimSpace(r.URL.Query().Get("page"))); err == nil && p > 0 {
page = p
}
pageSize := 30
start := (page - 1) * pageSize
if start > len(patients) {
start = len(patients)
}
end := start + pageSize
if end > len(patients) {
end = len(patients)
}
pagedPatients := patients[start:end]
hasMore := end < len(patients)
data := PatientsPartial{
Patients: patients,
IsRange: mode != "daily" || dateFrom != dateTo,
Patients: pagedPatients,
IsRange: mode != "daily" || dateFrom != dateTo,
Search: search,
ProgressStatus: progressStatus,
KpiFilter: kpiFilter,
Page: page,
PageSize: pageSize,
HasMore: hasMore,
NextPage: page + 1,
}
t := parse("templates/dashboard/partials/patients.html")
if err := t.ExecuteTemplate(w, "patients", data); err != nil {
templateName := "patients"
if r.URL.Query().Get("chunk") == "1" {
templateName = "patients-rows"
}
if err := t.ExecuteTemplate(w, templateName, data); err != nil {
log.Printf("[dashboard] patients template error: %v", err)
}
}