From 5f897cb6774b3058ed218e7c38c8b0de0f0eefa8 Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Mon, 17 Jul 2023 21:43:31 +0200 Subject: [PATCH] WIP site config forms --- render/templates/views/site_config.tmpl | 10 +- render/templates/views/site_config_list.tmpl | 58 ++++++++++ render/templates/views/site_config_me.tmpl | 43 ++++++++ web/app.go | 16 ++- web/siteconfig_list_handler.go | 106 +++++++++++++++++++ web/siteconfig_me_handler.go | 75 +++++++++++++ 6 files changed, 305 insertions(+), 3 deletions(-) create mode 100644 render/templates/views/site_config_list.tmpl create mode 100644 render/templates/views/site_config_me.tmpl create mode 100644 web/siteconfig_list_handler.go create mode 100644 web/siteconfig_me_handler.go diff --git a/render/templates/views/site_config.tmpl b/render/templates/views/site_config.tmpl index 90806ac..c9a10ee 100644 --- a/render/templates/views/site_config.tmpl +++ b/render/templates/views/site_config.tmpl @@ -2,7 +2,15 @@ {{define "main"}} -
+ + +

Site Settings

+ + diff --git a/render/templates/views/site_config_list.tmpl b/render/templates/views/site_config_list.tmpl new file mode 100644 index 0000000..3a3da65 --- /dev/null +++ b/render/templates/views/site_config_list.tmpl @@ -0,0 +1,58 @@ +{{define "title"}}Editor{{end}} + +{{define "main"}} + +

Create a List

+ + + + + + + + + {{ range .Types}} + + + {{end}} + +
+
+ + + + +
+ +

Me Links

+ + + + + + + + + + + + + {{range $i, $l := .Lists}} + + + + + + + + {{end}} + +
IdTitleIncludeListTypeActions
{{$l.Id}}{{$l.Title}}{{$l.Include}}{{$l.ListType}} +
+ + +
+
+ + +{{end}} \ No newline at end of file diff --git a/render/templates/views/site_config_me.tmpl b/render/templates/views/site_config_me.tmpl new file mode 100644 index 0000000..21037a7 --- /dev/null +++ b/render/templates/views/site_config_me.tmpl @@ -0,0 +1,43 @@ +{{define "title"}}Editor{{end}} + +{{define "main"}} + +

Create a Me Link

+
+ + + + + + + +
+ +

Me Links

+ + + + + + + + + + + {{range $i, $a := .}} + + + + + + {{end}} + +
NameURLActions
{{.Name}}{{.Url}} +
+ + +
+
+ + +{{end}} \ No newline at end of file diff --git a/web/app.go b/web/app.go index e02ef5a..b420b8a 100644 --- a/web/app.go +++ b/web/app.go @@ -55,8 +55,20 @@ func NewWebApp( // SiteConfig siteConfig := app.Group("/site-config") siteConfig.Use(middleware.NewAuthMiddleware(authorService).Handle) - siteConfig.Get("/", NewSiteConfigHandler(siteConfigRepo).HandleGet) - siteConfig.Post("/", NewSiteConfigHandler(siteConfigRepo).HandlePost) + + siteConfigHandler := NewSiteConfigHandler(siteConfigRepo) + siteConfig.Get("/", siteConfigHandler.HandleGet) + siteConfig.Post("/", siteConfigHandler.HandlePost) + + siteConfigMeHandler := NewSiteConfigMeHandler(siteConfigRepo) + siteConfig.Get("/me", siteConfigMeHandler.HandleGet) + siteConfig.Post("/me/create/", siteConfigMeHandler.HandleCreate) + siteConfig.Post("/me/delete/", siteConfigMeHandler.HandleDelete) + + siteConfigListHandler := NewSiteConfigListHandler(siteConfigRepo, typeRegistry) + siteConfig.Get("/lists", siteConfigListHandler.HandleGet) + siteConfig.Post("/lists/create/", siteConfigListHandler.HandleCreate) + siteConfig.Post("/lists/delete/", siteConfigListHandler.HandleDelete) // app.Static("/static/*filepath", http.Dir(repo.StaticDir())) app.Use("/static", filesystem.New(filesystem.Config{ diff --git a/web/siteconfig_list_handler.go b/web/siteconfig_list_handler.go new file mode 100644 index 0000000..d5f746e --- /dev/null +++ b/web/siteconfig_list_handler.go @@ -0,0 +1,106 @@ +package web + +import ( + "owl-blogs/app" + "owl-blogs/app/repository" + "owl-blogs/domain/model" + "owl-blogs/render" + "strconv" + + "github.com/gofiber/fiber/v2" +) + +type SiteConfigListHandler struct { + siteConfigRepo repository.SiteConfigRepository + typeRegistry *app.EntryTypeRegistry +} + +type siteConfigListTemplateData struct { + Lists []model.EntryList + Types []string +} + +func NewSiteConfigListHandler( + siteConfigRepo repository.SiteConfigRepository, + typeRegistry *app.EntryTypeRegistry, +) *SiteConfigListHandler { + return &SiteConfigListHandler{ + siteConfigRepo: siteConfigRepo, + typeRegistry: typeRegistry, + } +} + +func (h *SiteConfigListHandler) HandleGet(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + + config, err := h.siteConfigRepo.Get() + if err != nil { + return err + } + + types := make([]string, 0) + for _, t := range h.typeRegistry.Types() { + typeName, err := h.typeRegistry.TypeName(t) + if err != nil { + continue + } + types = append(types, typeName) + } + + return render.RenderTemplateWithBase( + c, getConfig(h.siteConfigRepo), "views/site_config_list", siteConfigListTemplateData{ + Lists: config.Lists, + Types: types, + }) +} + +func (h *SiteConfigListHandler) HandleCreate(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + + config, err := h.siteConfigRepo.Get() + if err != nil { + return err + } + + form, err := c.MultipartForm() + if err != nil { + return err + } + + config.Lists = append(config.Lists, model.EntryList{ + Id: c.FormValue("Id"), + Title: c.FormValue("Title"), + Include: form.Value["Include"], + ListType: c.FormValue("ListType"), + }) + + err = h.siteConfigRepo.Update(config) + if err != nil { + return err + } + + return c.Redirect("/site-config/lists") +} + +func (h *SiteConfigListHandler) HandleDelete(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + + config, err := h.siteConfigRepo.Get() + if err != nil { + return err + } + + id, err := strconv.Atoi(c.FormValue("idx")) + if err != nil { + return err + } + + config.Lists = append(config.Lists[:id], config.Lists[id+1:]...) + + err = h.siteConfigRepo.Update(config) + if err != nil { + return err + } + + return c.Redirect("/site-config/lists") +} diff --git a/web/siteconfig_me_handler.go b/web/siteconfig_me_handler.go new file mode 100644 index 0000000..3fdcf26 --- /dev/null +++ b/web/siteconfig_me_handler.go @@ -0,0 +1,75 @@ +package web + +import ( + "owl-blogs/app/repository" + "owl-blogs/domain/model" + "owl-blogs/render" + "strconv" + + "github.com/gofiber/fiber/v2" +) + +type SiteConfigMeHandler struct { + siteConfigRepo repository.SiteConfigRepository +} + +func NewSiteConfigMeHandler(siteConfigRepo repository.SiteConfigRepository) *SiteConfigMeHandler { + return &SiteConfigMeHandler{ + siteConfigRepo: siteConfigRepo, + } +} + +func (h *SiteConfigMeHandler) HandleGet(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + + config, err := h.siteConfigRepo.Get() + if err != nil { + return err + } + + return render.RenderTemplateWithBase( + c, getConfig(h.siteConfigRepo), "views/site_config_me", config.Me) +} + +func (h *SiteConfigMeHandler) HandleCreate(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + + config, err := h.siteConfigRepo.Get() + if err != nil { + return err + } + + config.Me = append(config.Me, model.MeLinks{ + Name: c.FormValue("Name"), + Url: c.FormValue("Url"), + }) + + err = h.siteConfigRepo.Update(config) + if err != nil { + return err + } + + return c.Redirect("/site-config/me") +} + +func (h *SiteConfigMeHandler) HandleDelete(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + + config, err := h.siteConfigRepo.Get() + if err != nil { + return err + } + + idx, err := strconv.Atoi(c.FormValue("idx")) + if err != nil { + return err + } + config.Me = append(config.Me[:idx], config.Me[idx+1:]...) + + err = h.siteConfigRepo.Update(config) + if err != nil { + return err + } + + return c.Redirect("/site-config/me") +}