Files
LazyPM/pkg/web/handler/dashboard.go
Moira Daniella A Sebastian 96291b7a94 Added issues dashboard
2026-02-23 19:48:10 +01:00

95 lines
2.4 KiB
Go

package handler
import (
"net/http"
"sort"
"github.com/LazyBachelor/LazyPM/internal/models"
"github.com/LazyBachelor/LazyPM/pkg/web/components"
"github.com/LazyBachelor/LazyPM/pkg/web/routes"
)
func orDisplay(s, fallback string) string {
if s != "" {
return s
}
return fallback
}
func selectedID(issue *models.Issue) string {
if issue == nil {
return ""
}
return issue.ID
}
func DashboardHandler(w http.ResponseWriter, r *http.Request) {
app := App(r)
issues, err := app.Issues.AllIssues(r.Context())
if err != nil {
http.Error(w, "Failed to retrieve issues", http.StatusInternalServerError)
return
}
var activeIssues, closedIssues []models.Issue
for _, issue := range issues {
if issue.Status == models.StatusClosed {
closedIssues = append(closedIssues, issue)
} else {
activeIssues = append(activeIssues, issue)
}
}
sort.Slice(activeIssues, func(i, j int) bool { return activeIssues[i].Priority > activeIssues[j].Priority })
sort.Slice(closedIssues, func(i, j int) bool { return closedIssues[i].Priority > closedIssues[j].Priority })
selID := r.URL.Query().Get("id")
var selectedIssue *models.Issue
if selID != "" {
for i := range issues {
if issues[i].ID == selID {
selectedIssue = &issues[i]
break
}
}
}
if selectedIssue == nil && len(activeIssues) > 0 {
selectedIssue = &activeIssues[0]
selID = selectedIssue.ID
}
searchQuery := r.URL.Query().Get("q")
var displayOwner, displayAssignee string
if selectedIssue != nil {
displayOwner = orDisplay(selectedIssue.Owner, "—")
displayAssignee = orDisplay(selectedIssue.Assignee, "—")
}
props := routes.DashboardProps{
ActiveIssues: activeIssues,
ClosedIssues: closedIssues,
SelectedIssue: selectedIssue,
SelectedID: selectedID(selectedIssue),
SearchQuery: searchQuery,
DisplayOwner: displayOwner,
DisplayAssignee: displayAssignee,
}
if HTMX(r).IsHxRequest() {
components.DashboardPage(components.DashboardPageProps{
ActiveIssues: props.ActiveIssues,
ClosedIssues: props.ClosedIssues,
SelectedIssue: props.SelectedIssue,
SelectedID: props.SelectedID,
BaseURL: "/dashboard",
QueryParam: "?id=",
EmptyText: "Select an issue to view details",
DisplayOwner: props.DisplayOwner,
DisplayAssignee: props.DisplayAssignee,
}).Render(r.Context(), w)
return
}
routes.Dashboard(props).Render(r.Context(), w)
}