95 lines
2.4 KiB
Go
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)
|
|
} |