From e8d34fde3f301e6138384560f16cb8b4d70078a9 Mon Sep 17 00:00:00 2001 From: juancwu Date: Sat, 7 Feb 2026 15:20:43 +0000 Subject: [PATCH] feat: edit shopping list name --- internal/handler/space.go | 25 +++++++++++ internal/routes/routes.go | 4 ++ .../shoppinglist/shoppinglist.templ | 42 +++++++++++++++++++ internal/ui/pages/app_space_list_detail.templ | 2 +- 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/internal/handler/space.go b/internal/handler/space.go index 3ad7593..7296d11 100644 --- a/internal/handler/space.go +++ b/internal/handler/space.go @@ -146,6 +146,31 @@ func (h *SpaceHandler) CreateList(w http.ResponseWriter, r *http.Request) { ui.Render(w, r, shoppinglist.ListItem(newList)) } +func (h *SpaceHandler) UpdateList(w http.ResponseWriter, r *http.Request) { + spaceID := r.PathValue("spaceID") + listID := r.PathValue("listID") + + if err := r.ParseForm(); err != nil { + http.Error(w, "Bad Request", http.StatusBadRequest) + return + } + + name := r.FormValue("name") + if name == "" { + http.Error(w, "List name is required", http.StatusBadRequest) + return + } + + updatedList, err := h.listService.UpdateList(listID, name) + if err != nil { + slog.Error("failed to update list", "error", err, "list_id", listID) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + ui.Render(w, r, shoppinglist.ListNameHeader(spaceID, updatedList)) +} + func (h *SpaceHandler) ListPage(w http.ResponseWriter, r *http.Request) { spaceID := r.PathValue("spaceID") listID := r.PathValue("listID") diff --git a/internal/routes/routes.go b/internal/routes/routes.go index ec5a87d..37d8248 100644 --- a/internal/routes/routes.go +++ b/internal/routes/routes.go @@ -76,6 +76,10 @@ func SetupRoutes(a *app.App) http.Handler { listPageWithAccess := middleware.RequireSpaceAccess(a.SpaceService)(listPageHandler) mux.Handle("GET /app/spaces/{spaceID}/lists/{listID}", listPageWithAccess) + updateListHandler := middleware.RequireAuth(space.UpdateList) + updateListWithAccess := middleware.RequireSpaceAccess(a.SpaceService)(updateListHandler) + mux.Handle("PATCH /app/spaces/{spaceID}/lists/{listID}", updateListWithAccess) + addItemHandler := middleware.RequireAuth(space.AddItemToList) addItemWithAccess := middleware.RequireSpaceAccess(a.SpaceService)(addItemHandler) mux.Handle("POST /app/spaces/{spaceID}/lists/{listID}/items", addItemWithAccess) diff --git a/internal/ui/components/shoppinglist/shoppinglist.templ b/internal/ui/components/shoppinglist/shoppinglist.templ index 4e0531d..a2843b9 100644 --- a/internal/ui/components/shoppinglist/shoppinglist.templ +++ b/internal/ui/components/shoppinglist/shoppinglist.templ @@ -4,8 +4,50 @@ import ( "fmt" "git.juancwu.dev/juancwu/budgit/internal/model" "git.juancwu.dev/juancwu/budgit/internal/ui/components/checkbox" + "git.juancwu.dev/juancwu/budgit/internal/ui/components/csrf" + "git.juancwu.dev/juancwu/budgit/internal/ui/components/input" ) +templ ListNameHeader(spaceID string, list *model.ShoppingList) { +
+

{ list.Name }

+ +
+ +} + templ ListItem(list *model.ShoppingList) {
diff --git a/internal/ui/pages/app_space_list_detail.templ b/internal/ui/pages/app_space_list_detail.templ index 26adf15..64a1af3 100644 --- a/internal/ui/pages/app_space_list_detail.templ +++ b/internal/ui/pages/app_space_list_detail.templ @@ -12,7 +12,7 @@ import ( templ SpaceListDetailPage(space *model.Space, list *model.ShoppingList, items []*model.ListItem) { @layouts.Space(list.Name, space) {
-

{ list.Name }

+ @shoppinglist.ListNameHeader(space.ID, list)