diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index db4a16b..b67ad6b 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -182,158 +182,155 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) { token := getToken(r) orgs := h.getUserOrgs(r) + type dashboardData struct { + Items []giteaclient.TriageItem + Error string + } + + var data dashboardData + if len(orgs) == 0 { - renderPage(w, r, "Dashboard", "dashboard", - `
No organizations found. Check your token permissions.
`) - return + data.Error = "No organizations found. Check your token permissions." + } else { + queue, err := h.Client.GetTriageQueue(r.Context(), token, orgs) + if err != nil { + slog.Error("failed to get triage queue", "error", err) + data.Error = "Error loading triage queue." + } else { + data.Items = queue + } } - queue, err := h.Client.GetTriageQueue(r.Context(), token, orgs) + tmpl, err := template.ParseFiles("internal/templates/dashboard.html") if err != nil { - slog.Error("failed to get triage queue", "error", err) - renderPage(w, r, "Dashboard", "dashboard", - `Error loading triage queue.
`) + slog.Error("failed to parse dashboard template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) return } - if len(queue) == 0 { - renderPage(w, r, "Dashboard", "dashboard", - `No items need attention. Nice work!
`) + var buf strings.Builder + if err := tmpl.ExecuteTemplate(&buf, "content", data); err != nil { + slog.Error("failed to execute dashboard template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) return } - content := `No organizations found.
`) - return + type issuesData struct { + Issues []giteaclient.Issue + Orgs []string + SelectedOrg string + SelectedState string + HasMore bool + NextPage int + Error string } - issues, err := h.Client.ListAllIssues(r.Context(), token, orgs) + selectedOrg := r.URL.Query().Get("org") + selectedState := r.URL.Query().Get("state") + if selectedState == "" { + selectedState = "open" + } + + data := issuesData{ + Orgs: orgNames, + SelectedOrg: selectedOrg, + SelectedState: selectedState, + } + + if len(orgNames) == 0 { + data.Error = "No organizations found." + } else { + // Filter to selected org if specified. + queryOrgs := orgNames + if selectedOrg != "" { + queryOrgs = []string{selectedOrg} + } + + issues, err := h.Client.ListAllIssues(r.Context(), token, queryOrgs) + if err != nil { + slog.Error("failed to list issues", "error", err) + data.Error = "Error loading issues." + } else { + data.Issues = issues + } + } + + tmpl, err := template.ParseFiles("internal/templates/issues.html") if err != nil { - slog.Error("failed to list issues", "error", err) - renderPage(w, r, "Issues", "issues", - `Error loading issues.
`) + slog.Error("failed to parse issues template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) return } - if len(issues) == 0 { - renderPage(w, r, "Issues", "issues", - `No open issues found.
`) + var buf strings.Builder + if err := tmpl.ExecuteTemplate(&buf, "content", data); err != nil { + slog.Error("failed to execute issues template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) return } - content := `No organizations found.
`) - return + type pullsData struct { + Pulls []giteaclient.PullRequest + Orgs []string + SelectedOrg string + Error string } - prs, err := h.Client.ListAllPullRequests(r.Context(), token, orgs) + selectedOrg := r.URL.Query().Get("org") + + data := pullsData{ + Orgs: orgNames, + SelectedOrg: selectedOrg, + } + + if len(orgNames) == 0 { + data.Error = "No organizations found." + } else { + queryOrgs := orgNames + if selectedOrg != "" { + queryOrgs = []string{selectedOrg} + } + + prs, err := h.Client.ListAllPullRequests(r.Context(), token, queryOrgs) + if err != nil { + slog.Error("failed to list pull requests", "error", err) + data.Error = "Error loading pull requests." + } else { + data.Pulls = prs + } + } + + tmpl, err := template.ParseFiles("internal/templates/pulls.html") if err != nil { - slog.Error("failed to list pull requests", "error", err) - renderPage(w, r, "Pull Requests", "pulls", - `Error loading pull requests.
`) + slog.Error("failed to parse pulls template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) return } - if len(prs) == 0 { - renderPage(w, r, "Pull Requests", "pulls", - `No open pull requests found.
`) + var buf strings.Builder + if err := tmpl.ExecuteTemplate(&buf, "content", data); err != nil { + slog.Error("failed to execute pulls template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) return } - content := `