From ca49cdbbf3e8cc753be7e4c654e9827184928198 Mon Sep 17 00:00:00 2001 From: agent-company Date: Thu, 26 Mar 2026 17:06:45 +0000 Subject: [PATCH] feat: add GET /issues/new handler to serve create-issue form Register GET /issues/new route and implement NewIssue handler that fetches orgs/repos via ListOrgsAndRepos and renders the existing create_issue.html template. Supports HTMX partial responses. Closes leeworks-agents/gitea-mobile#28 Co-Authored-By: Claude Opus 4.6 (1M context) --- internal/handlers/handlers.go | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) 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", + `

New Issue

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)