diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index 30f68af..f9e473d 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -38,6 +38,7 @@ func (h *Handler) RegisterRoutes(mux *http.ServeMux) { // Issues. mux.HandleFunc("GET /issues", h.ListIssues) + mux.HandleFunc("GET /issues/new", h.NewIssue) mux.HandleFunc("POST /issues", h.CreateIssue) mux.HandleFunc("POST /issues/{owner}/{repo}/{index}/labels", h.ApplyLabels) @@ -444,6 +445,41 @@ func (h *Handler) PullDetail(w http.ResponseWriter, r *http.Request) { renderPage(w, r, fmt.Sprintf("PR #%d", index), "pulls", buf.String()) } +// NewIssue handles GET /issues/new — renders the create-issue form. +func (h *Handler) NewIssue(w http.ResponseWriter, r *http.Request) { + token := getToken(r) + + repos, err := h.Client.ListOrgsAndRepos(r.Context(), token) + if err != nil { + slog.Error("failed to list repos for new issue form", "error", err) + renderPage(w, r, "New Issue", "issues", + `
Error loading repositories.
`) + return + } + + tmpl, err := template.ParseFiles("internal/templates/create_issue.html") + if err != nil { + slog.Error("failed to parse create_issue template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) + return + } + + type templateData struct { + Repos map[string][]giteaclient.Repo + } + + data := templateData{Repos: repos} + + var buf strings.Builder + if err := tmpl.ExecuteTemplate(&buf, "content", data); err != nil { + slog.Error("failed to execute create_issue template", "error", err) + http.Error(w, "template error", http.StatusInternalServerError) + return + } + + renderPage(w, r, "New Issue", "issues", buf.String()) +} + // CreateIssue handles POST /issues. func (h *Handler) CreateIssue(w http.ResponseWriter, r *http.Request) { token := getToken(r)