diff --git a/internal/handler/space.go b/internal/handler/space.go index c81a196..f6b47f5 100644 --- a/internal/handler/space.go +++ b/internal/handler/space.go @@ -178,6 +178,72 @@ func (h *spaceHandler) SpaceOverviewPage(w http.ResponseWriter, r *http.Request) })) } +func (h *spaceHandler) SpaceCreateAccountPage(w http.ResponseWriter, r *http.Request) { + spaceID := r.PathValue("spaceID") + + space, err := h.spaceService.GetSpace(spaceID) + if err != nil { + slog.Error("failed to fetch space", "error", err, "space_id", spaceID) + ui.Render(w, r, pages.NotFound()) + return + } + + ui.Render(w, r, pages.SpaceCreateAccountPage(pages.SpaceCreateAccountPageProps{ + SpaceID: space.ID, + SpaceName: space.Name, + Form: forms.CreateAccountProps{ + SpaceID: space.ID, + }, + })) +} + +func (h *spaceHandler) HandleCreateAccount(w http.ResponseWriter, r *http.Request) { + spaceID := r.PathValue("spaceID") + nameInput := strings.TrimSpace(r.FormValue("name")) + + formProps := forms.CreateAccountProps{ + SpaceID: spaceID, + Name: nameInput, + } + + if nameInput == "" { + formProps.NameErr = "Account name is required." + ui.Render(w, r, forms.CreateAccount(formProps)) + return + } + + existing, err := h.accountService.GetAccountsForSpace(spaceID) + if err != nil { + slog.Error("failed to load accounts", "error", err, "space_id", spaceID) + formProps.GeneralErr = "Something went wrong. Please try again." + ui.Render(w, r, forms.CreateAccount(formProps)) + return + } + for _, a := range existing { + if strings.EqualFold(strings.TrimSpace(a.Name), nameInput) { + formProps.NameErr = "An account with this name already exists in this space." + ui.Render(w, r, forms.CreateAccount(formProps)) + return + } + } + + account, err := h.accountService.CreateAccount(spaceID, nameInput) + if err != nil { + slog.Error("failed to create account", "error", err, "space_id", spaceID) + formProps.GeneralErr = "Something went wrong. Please try again." + ui.Render(w, r, forms.CreateAccount(formProps)) + return + } + + redirectTo := routeurl.URL( + "page.app.spaces.space.accounts.account.overview", + "spaceID", spaceID, + "accountID", account.ID, + ) + w.Header().Set("HX-Redirect", redirectTo) + w.WriteHeader(http.StatusOK) +} + func (h *spaceHandler) SpaceAccountPage(w http.ResponseWriter, r *http.Request) { spaceID := r.PathValue("spaceID") accountID := r.PathValue("accountID") diff --git a/internal/routes/routes.go b/internal/routes/routes.go index 8c36e82..8f70af4 100644 --- a/internal/routes/routes.go +++ b/internal/routes/routes.go @@ -92,6 +92,8 @@ func SetupRoutes(a *app.App) http.Handler { spaceAccessMw := middleware.RequireSpaceAccess(a.SpaceService) g.Use(spaceAccessMw) g.Get("/overview", spaceH.SpaceOverviewPage).Name("page.app.spaces.space.overview") + g.Get("/accounts/create", spaceH.SpaceCreateAccountPage).Name("page.app.spaces.space.accounts.create") + g.Post("/accounts/create", spaceH.HandleCreateAccount).Name("action.app.spaces.space.accounts.create") g.SubGroup("/accounts/{accountID}", func(g *router.Group) { g.Get("/overview", spaceH.SpaceAccountPage).Name("page.app.spaces.space.accounts.account.overview") diff --git a/internal/ui/forms/create_account.templ b/internal/ui/forms/create_account.templ new file mode 100644 index 0000000..6216e2c --- /dev/null +++ b/internal/ui/forms/create_account.templ @@ -0,0 +1,68 @@ +package forms + +import "git.juancwu.dev/juancwu/budgit/internal/routeurl" +import "git.juancwu.dev/juancwu/budgit/internal/ui/components/button" +import "git.juancwu.dev/juancwu/budgit/internal/ui/components/card" +import "git.juancwu.dev/juancwu/budgit/internal/ui/components/form" +import "git.juancwu.dev/juancwu/budgit/internal/ui/components/input" + +type CreateAccountProps struct { + SpaceID string + + Name string + + NameErr string + GeneralErr string +} + +templ CreateAccount(props CreateAccountProps) { +
+} diff --git a/internal/ui/pages/space_create_account.templ b/internal/ui/pages/space_create_account.templ new file mode 100644 index 0000000..1f99537 --- /dev/null +++ b/internal/ui/pages/space_create_account.templ @@ -0,0 +1,24 @@ +package pages + +import "git.juancwu.dev/juancwu/budgit/internal/ui/forms" +import "git.juancwu.dev/juancwu/budgit/internal/ui/layouts" + +type SpaceCreateAccountPageProps struct { + SpaceID string + SpaceName string + Form forms.CreateAccountProps +} + +templ SpaceCreateAccountPage(props SpaceCreateAccountPageProps) { + @layouts.App("Create Account", spaceOverviewSidebarContent(), spaceSpecificSidebarContent(props.SpaceID)) { ++ Add a new account to { props.SpaceName }. +
+Space overview
No accounts yet.
+No accounts yet. Create one to get started.
} else {