diff --git a/render/templates/views/site_config_menus.tmpl b/render/templates/views/site_config_menus.tmpl
new file mode 100644
index 0000000..b1caeb0
--- /dev/null
+++ b/render/templates/views/site_config_menus.tmpl
@@ -0,0 +1,95 @@
+{{define "title"}}Editor{{end}}
+
+{{define "main"}}
+
+
Create a List
+
+
+Header Menu
+
+
+
+
+ Title |
+ List |
+ Url |
+ Post |
+ Actions |
+
+
+
+ {{range $i, $l := .HeaderMenu}}
+
+ {{$l.Title}} |
+ {{$l.List}} |
+ {{$l.Url}} |
+ {{$l.Post}} |
+
+
+ |
+
+ {{end}}
+
+
+
+
+Footer Menu
+
+
+
+
+ Title |
+ List |
+ Url |
+ Post |
+ Actions |
+
+
+
+ {{range $i, $l := .FooterMenu}}
+
+ {{$l.Title}} |
+ {{$l.List}} |
+ {{$l.Url}} |
+ {{$l.Post}} |
+
+
+ |
+
+ {{end}}
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/web/app.go b/web/app.go
index b420b8a..0c12859 100644
--- a/web/app.go
+++ b/web/app.go
@@ -70,6 +70,11 @@ func NewWebApp(
siteConfig.Post("/lists/create/", siteConfigListHandler.HandleCreate)
siteConfig.Post("/lists/delete/", siteConfigListHandler.HandleDelete)
+ siteConfigMenusHandler := NewSiteConfigMenusHandler(siteConfigRepo)
+ siteConfig.Get("/menus", siteConfigMenusHandler.HandleGet)
+ siteConfig.Post("/menus/create/", siteConfigMenusHandler.HandleCreate)
+ siteConfig.Post("/menus/delete/", siteConfigMenusHandler.HandleDelete)
+
// app.Static("/static/*filepath", http.Dir(repo.StaticDir()))
app.Use("/static", filesystem.New(filesystem.Config{
Root: http.FS(embedDirStatic),
diff --git a/web/siteconfig_menus_handler.go b/web/siteconfig_menus_handler.go
new file mode 100644
index 0000000..0236c9e
--- /dev/null
+++ b/web/siteconfig_menus_handler.go
@@ -0,0 +1,97 @@
+package web
+
+import (
+ "owl-blogs/app/repository"
+ "owl-blogs/domain/model"
+ "owl-blogs/render"
+ "strconv"
+
+ "github.com/gofiber/fiber/v2"
+)
+
+type SiteConfigMenusHandler struct {
+ siteConfigRepo repository.SiteConfigRepository
+}
+
+type siteConfigMenusTemplateData struct {
+ HeaderMenu []model.MenuItem
+ FooterMenu []model.MenuItem
+}
+
+func NewSiteConfigMenusHandler(siteConfigRepo repository.SiteConfigRepository) *SiteConfigMenusHandler {
+ return &SiteConfigMenusHandler{
+ siteConfigRepo: siteConfigRepo,
+ }
+}
+
+func (h *SiteConfigMenusHandler) 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_menus", siteConfigMenusTemplateData{
+ HeaderMenu: config.HeaderMenu,
+ FooterMenu: config.FooterMenu,
+ })
+}
+
+func (h *SiteConfigMenusHandler) HandleCreate(c *fiber.Ctx) error {
+ c.Set(fiber.HeaderContentType, fiber.MIMETextHTML)
+
+ config, err := h.siteConfigRepo.Get()
+ if err != nil {
+ return err
+ }
+
+ menuItem := model.MenuItem{
+ Title: c.FormValue("Title"),
+ List: c.FormValue("List"),
+ Url: c.FormValue("Url"),
+ Post: c.FormValue("Post"),
+ }
+
+ if c.FormValue("menu") == "header" {
+ config.HeaderMenu = append(config.HeaderMenu, menuItem)
+ } else if c.FormValue("menu") == "footer" {
+ config.FooterMenu = append(config.FooterMenu, menuItem)
+ }
+
+ err = h.siteConfigRepo.Update(config)
+ if err != nil {
+ return err
+ }
+
+ return c.Redirect("/site-config/menus")
+}
+
+func (h *SiteConfigMenusHandler) HandleDelete(c *fiber.Ctx) error {
+ c.Set(fiber.HeaderContentType, fiber.MIMETextHTML)
+
+ config, err := h.siteConfigRepo.Get()
+ if err != nil {
+ return err
+ }
+
+ menu := c.FormValue("menu")
+ idx, err := strconv.Atoi(c.FormValue("idx"))
+ if err != nil {
+ return err
+ }
+
+ if menu == "header" {
+ config.HeaderMenu = append(config.HeaderMenu[:idx], config.HeaderMenu[idx+1:]...)
+ } else if menu == "footer" {
+ config.FooterMenu = append(config.FooterMenu[:idx], config.FooterMenu[idx+1:]...)
+ }
+
+ err = h.siteConfigRepo.Update(config)
+ if err != nil {
+ return err
+ }
+
+ return c.Redirect("/site-config/menus")
+}