Files
cpone_dashboard/cpone-dashboard/menu/result/handler.go
2026-05-04 10:44:38 +07:00

135 lines
3.2 KiB
Go

package result
import (
"cpone-dashboard/menu/auth"
"cpone-dashboard/menu/projects"
"html/template"
"net/http"
"strconv"
)
var tmpl *template.Template
var pdfBaseURL string
var basePath string
const defaultPageSize = 30
func SetTemplates(t *template.Template) { tmpl = t }
func SetPDFBaseURL(u string) { pdfBaseURL = u }
func SetBasePath(p string) { basePath = p }
type pageData struct {
Username string
CurrentProject projects.ProjectItem
Search string
Filter string
Rows []ResultRow
FilteredRows []ResultRow
Summary ResultSummary
PDFBaseURL string
Page int
PageSize int
HasMore bool
VisibleCount int
TotalFiltered int
NextPage int
}
func parsePage(q string) int {
p, err := strconv.Atoi(q)
if err != nil || p < 1 {
return 1
}
return p
}
func buildResultData(r *http.Request) (pageData, int, error) {
username := auth.Username(r)
mcuID := auth.SelectedProjectID(r)
if mcuID == 0 {
return pageData{}, http.StatusSeeOther, nil
}
project, ok, err := projects.GetUserProject(username, mcuID)
if err != nil {
return pageData{}, http.StatusInternalServerError, err
}
if !ok {
return pageData{}, http.StatusSeeOther, nil
}
rows, err := GetResultRows(mcuID)
if err != nil {
return pageData{}, http.StatusInternalServerError, err
}
summary := BuildResultSummary(rows)
search := r.URL.Query().Get("search")
filter := r.URL.Query().Get("filter")
filteredRows := FilterResultRows(rows, search, filter)
page := parsePage(r.URL.Query().Get("page"))
pagedRows, hasMore := PaginateResultRows(filteredRows, page, defaultPageSize)
visibleCount := page * defaultPageSize
if visibleCount > len(filteredRows) {
visibleCount = len(filteredRows)
}
return pageData{
Username: username,
CurrentProject: project,
Search: search,
Filter: filter,
Rows: rows,
FilteredRows: pagedRows,
Summary: summary,
PDFBaseURL: pdfBaseURL,
Page: page,
PageSize: defaultPageSize,
HasMore: hasMore,
VisibleCount: visibleCount,
TotalFiltered: len(filteredRows),
NextPage: page + 1,
}, http.StatusOK, nil
}
func Index(w http.ResponseWriter, r *http.Request) {
t := tmpl
if t == nil {
http.Error(w, "template not ready", http.StatusInternalServerError)
return
}
data, status, err := buildResultData(r)
if err != nil {
http.Error(w, "query error", status)
return
}
if status == http.StatusSeeOther {
http.Redirect(w, r, basePath+"/projects", http.StatusSeeOther)
return
}
if err := t.ExecuteTemplate(w, "base", data); err != nil {
http.Error(w, "template error", http.StatusInternalServerError)
}
}
func List(w http.ResponseWriter, r *http.Request) {
t := tmpl
if t == nil {
http.Error(w, "template not ready", http.StatusInternalServerError)
return
}
data, status, err := buildResultData(r)
if err != nil {
http.Error(w, "query error", status)
return
}
if status == http.StatusSeeOther {
http.Error(w, "unauthorized", http.StatusUnauthorized)
return
}
if err := t.ExecuteTemplate(w, "result-list-chunk", data); err != nil {
http.Error(w, "template error", http.StatusInternalServerError)
}
}