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

@@ -23,6 +23,8 @@ type pageData struct {
CurrentProject projects.ProjectItem
Search string
Filter string
Packet string
PacketOptions []PacketOption
Rows []ResultRow
FilteredRows []ResultRow
Summary ResultSummary
@@ -65,7 +67,9 @@ func buildResultData(r *http.Request) (pageData, int, error) {
summary := BuildResultSummary(rows)
search := r.URL.Query().Get("search")
filter := r.URL.Query().Get("filter")
filteredRows := FilterResultRows(rows, search, filter)
packet := r.URL.Query().Get("packet")
packetOptions := UniquePackets(rows)
filteredRows := FilterResultRows(rows, search, filter, packet)
page := parsePage(r.URL.Query().Get("page"))
pagedRows, hasMore := PaginateResultRows(filteredRows, page, defaultPageSize)
visibleCount := page * defaultPageSize
@@ -78,6 +82,8 @@ func buildResultData(r *http.Request) (pageData, int, error) {
CurrentProject: project,
Search: search,
Filter: filter,
Packet: packet,
PacketOptions: packetOptions,
Rows: rows,
FilteredRows: pagedRows,
Summary: summary,

View File

@@ -9,6 +9,9 @@ type ResultRow struct {
NIP string
Name string
Posisi string
PacketCode string
PacketName string
Tests string
FileUrl string
ReportDate string
}
@@ -29,6 +32,17 @@ func GetResultRows(mcuID int) ([]ResultRow, error) {
NULLIF(TRIM(mp.Mcu_PatientPosisi), ''),
'-'
) AS posisi,
COALESCE((
SELECT GROUP_CONCAT(DISTINCT COALESCE(NULLIF(TRIM(pp.Mcu_PatientPacketCode), ''), pp.Mcu_PatientPacketName) ORDER BY COALESCE(NULLIF(TRIM(pp.Mcu_PatientPacketCode), ''), pp.Mcu_PatientPacketName) SEPARATOR ',')
FROM mcu_patient_packet pp
WHERE pp.Mcu_PatientPacketPreregisterID = mp.Mcu_PatientPreregisterID
), '') AS packet_code,
COALESCE((
SELECT GROUP_CONCAT(DISTINCT pp.Mcu_PatientPacketName ORDER BY pp.Mcu_PatientPacketName SEPARATOR ', ')
FROM mcu_patient_packet pp
WHERE pp.Mcu_PatientPacketPreregisterID = mp.Mcu_PatientPreregisterID
), '') AS packet_name,
COALESCE(NULLIF(TRIM(mp.Mcu_PatientPemeriksaan), ''), '') AS tests,
COALESCE(p.Published_McuDasboardFileUrl, '') AS file_url,
CASE
WHEN p.Published_McuDasboardFileUrl IS NOT NULL
@@ -53,7 +67,7 @@ func GetResultRows(mcuID int) ([]ResultRow, error) {
var result []ResultRow
for rows.Next() {
var r ResultRow
if err := rows.Scan(&r.NIP, &r.Name, &r.Posisi, &r.FileUrl, &r.ReportDate); err != nil {
if err := rows.Scan(&r.NIP, &r.Name, &r.Posisi, &r.PacketCode, &r.PacketName, &r.Tests, &r.FileUrl, &r.ReportDate); err != nil {
continue
}
result = append(result, r)
@@ -71,14 +85,18 @@ func BuildResultSummary(rows []ResultRow) ResultSummary {
return s
}
func FilterResultRows(rows []ResultRow, search, filter string) []ResultRow {
func FilterResultRows(rows []ResultRow, search, filter, packetCode string) []ResultRow {
search = strings.ToLower(strings.TrimSpace(search))
filter = strings.TrimSpace(filter)
if search == "" && filter == "" {
packetCode = strings.TrimSpace(packetCode)
if search == "" && filter == "" && packetCode == "" {
return rows
}
out := make([]ResultRow, 0, len(rows))
for _, r := range rows {
if packetCode != "" && r.PacketCode != packetCode {
continue
}
switch filter {
case "has_pdf":
if r.FileUrl == "" {
@@ -90,7 +108,7 @@ func FilterResultRows(rows []ResultRow, search, filter string) []ResultRow {
}
}
if search != "" {
hay := strings.ToLower(r.Name + " " + r.NIP + " " + r.Posisi)
hay := strings.ToLower(r.Name + " " + r.NIP + " " + r.Posisi + " " + r.PacketCode + " " + r.PacketName + " " + r.Tests)
if !strings.Contains(hay, search) {
continue
}
@@ -100,6 +118,39 @@ func FilterResultRows(rows []ResultRow, search, filter string) []ResultRow {
return out
}
type PacketOption struct {
Code string
Name string
}
func UniquePackets(rows []ResultRow) []PacketOption {
seen := map[string]struct{}{}
out := []PacketOption{}
for _, r := range rows {
code := strings.TrimSpace(r.PacketCode)
if code == "" {
continue
}
if _, ok := seen[code]; ok {
continue
}
seen[code] = struct{}{}
name := strings.TrimSpace(r.PacketName)
if name == "" {
name = code
}
out = append(out, PacketOption{Code: code, Name: name})
}
for i := 0; i < len(out); i++ {
for j := i + 1; j < len(out); j++ {
if out[j].Code < out[i].Code {
out[i], out[j] = out[j], out[i]
}
}
}
return out
}
func PaginateResultRows(rows []ResultRow, page, pageSize int) ([]ResultRow, bool) {
if page < 1 {
page = 1