Update dashboard filters and packet views
This commit is contained in:
@@ -21,6 +21,8 @@ type pageData struct {
|
||||
CurrentProject projects.ProjectItem
|
||||
Search string
|
||||
Status string
|
||||
Packet string
|
||||
PacketOptions []PacketOption
|
||||
Rows []ProgressRow
|
||||
FilteredRows []ProgressRow
|
||||
Summary ProgressSummary
|
||||
@@ -64,7 +66,9 @@ func buildProgressData(r *http.Request) (pageData, int, error) {
|
||||
summary := BuildProgressSummary(rows)
|
||||
search := r.URL.Query().Get("search")
|
||||
status := r.URL.Query().Get("status")
|
||||
filteredRows := FilterProgressRows(rows, search, status)
|
||||
packet := r.URL.Query().Get("packet")
|
||||
packetOptions := UniquePackets(rows)
|
||||
filteredRows := FilterProgressRows(rows, search, status, packet)
|
||||
page := parsePage(r.URL.Query().Get("page"))
|
||||
pagedRows, hasMore := PaginateProgressRows(filteredRows, page, defaultPageSize)
|
||||
visibleCount := page * defaultPageSize
|
||||
@@ -77,6 +81,8 @@ func buildProgressData(r *http.Request) (pageData, int, error) {
|
||||
CurrentProject: project,
|
||||
Search: search,
|
||||
Status: status,
|
||||
Packet: packet,
|
||||
PacketOptions: packetOptions,
|
||||
Rows: rows,
|
||||
FilteredRows: pagedRows,
|
||||
Summary: summary,
|
||||
|
||||
@@ -10,6 +10,9 @@ type ProgressRow struct {
|
||||
NIP string
|
||||
Name string
|
||||
Posisi string
|
||||
PacketCode string
|
||||
PacketName string
|
||||
Tests string
|
||||
ResumeStatus string
|
||||
Validated string
|
||||
Published string
|
||||
@@ -33,6 +36,17 @@ func GetProgressRows(mcuID int) ([]ProgressRow, 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(rs.Mcu_PatientResumeStatusStatus, '') AS resume_status,
|
||||
COALESCE(rs.Mcu_PatientResumeStatusValidated, 'N') AS validated,
|
||||
COALESCE(rs.Mcu_PatientResumeStatusPublished, 'N') AS published
|
||||
@@ -54,7 +68,7 @@ func GetProgressRows(mcuID int) ([]ProgressRow, error) {
|
||||
var result []ProgressRow
|
||||
for rows.Next() {
|
||||
var r ProgressRow
|
||||
if err := rows.Scan(&r.PreregisterID, &r.NIP, &r.Name, &r.Posisi, &r.ResumeStatus, &r.Validated, &r.Published); err != nil {
|
||||
if err := rows.Scan(&r.PreregisterID, &r.NIP, &r.Name, &r.Posisi, &r.PacketCode, &r.PacketName, &r.Tests, &r.ResumeStatus, &r.Validated, &r.Published); err != nil {
|
||||
continue
|
||||
}
|
||||
result = append(result, r)
|
||||
@@ -75,14 +89,18 @@ func BuildProgressSummary(rows []ProgressRow) ProgressSummary {
|
||||
return s
|
||||
}
|
||||
|
||||
func FilterProgressRows(rows []ProgressRow, search, status string) []ProgressRow {
|
||||
func FilterProgressRows(rows []ProgressRow, search, status, packetCode string) []ProgressRow {
|
||||
search = strings.ToLower(strings.TrimSpace(search))
|
||||
status = strings.TrimSpace(status)
|
||||
if search == "" && status == "" {
|
||||
packetCode = strings.TrimSpace(packetCode)
|
||||
if search == "" && status == "" && packetCode == "" {
|
||||
return rows
|
||||
}
|
||||
out := make([]ProgressRow, 0, len(rows))
|
||||
for _, r := range rows {
|
||||
if packetCode != "" && r.PacketCode != packetCode {
|
||||
continue
|
||||
}
|
||||
switch status {
|
||||
case "validated":
|
||||
if r.Validated != "Y" {
|
||||
@@ -102,7 +120,7 @@ func FilterProgressRows(rows []ProgressRow, search, status string) []ProgressRow
|
||||
}
|
||||
}
|
||||
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
|
||||
}
|
||||
@@ -112,6 +130,40 @@ func FilterProgressRows(rows []ProgressRow, search, status string) []ProgressRow
|
||||
return out
|
||||
}
|
||||
|
||||
type PacketOption struct {
|
||||
Code string
|
||||
Name string
|
||||
}
|
||||
|
||||
func UniquePackets(rows []ProgressRow) []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})
|
||||
}
|
||||
// Keep deterministic order without new imports.
|
||||
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 Pct(num, total int) int {
|
||||
if total == 0 {
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user