diff --git a/embed/initial/base.html b/embed/initial/base.html index 5fee043..fbcff5b 100644 --- a/embed/initial/base.html +++ b/embed/initial/base.html @@ -88,6 +88,17 @@ +
diff --git a/renderer.go b/renderer.go index f96ba39..fd66fa5 100644 --- a/renderer.go +++ b/renderer.go @@ -49,6 +49,12 @@ func noescape(str string) template.HTML { return template.HTML(str) } +func listUrl(user User, id string) string { + return user.ListUrl(PostList{ + Id: id, + }) +} + func renderEmbedTemplate(templateFile string, data interface{}) (string, error) { templateStr, err := embed_files.ReadFile(templateFile) if err != nil { @@ -60,6 +66,7 @@ func renderEmbedTemplate(templateFile string, data interface{}) (string, error) func renderTemplateStr(templateStr []byte, data interface{}) (string, error) { t, err := template.New("_").Funcs(template.FuncMap{ "noescape": noescape, + "listUrl": listUrl, }).Parse(string(templateStr)) if err != nil { return "", err @@ -74,7 +81,10 @@ func renderTemplateStr(templateStr []byte, data interface{}) (string, error) { func renderIntoBaseTemplate(user User, data PageContent) (string, error) { baseTemplate, _ := user.Template() - t, err := template.New("index").Parse(baseTemplate) + t, err := template.New("index").Funcs(template.FuncMap{ + "noescape": noescape, + "listUrl": listUrl, + }).Parse(baseTemplate) if err != nil { return "", err } diff --git a/renderer_test.go b/renderer_test.go index d21bcdc..62bbe13 100644 --- a/renderer_test.go +++ b/renderer_test.go @@ -406,3 +406,25 @@ func TestRenderUserAuthHiddenFields(t *testing.T) { assertions.AssertContains(t, result, "name=\"response_type\" value=\"code\"") assertions.AssertContains(t, result, "name=\"state\" value=\"teststate\"") } + +func TestRenderHeaderMenuListItem(t *testing.T) { + user := getTestUser() + user.AddHeaderMenuItem(owl.MenuItem{ + Title: "Test Entry", + List: "test", + }) + result, _ := owl.RenderIndexPage(user) + assertions.AssertContains(t, result, "Test Entry") + assertions.AssertContains(t, result, "/lists/test") +} + +func TestRenderHeaderMenuUrlItem(t *testing.T) { + user := getTestUser() + user.AddHeaderMenuItem(owl.MenuItem{ + Title: "Test Entry", + Url: "https://example.com", + }) + result, _ := owl.RenderIndexPage(user) + assertions.AssertContains(t, result, "Test Entry") + assertions.AssertContains(t, result, "https://example.com") +} diff --git a/user.go b/user.go index a6d419b..cd46847 100644 --- a/user.go +++ b/user.go @@ -28,6 +28,7 @@ type UserConfig struct { PassworHash string `yaml:"password_hash"` Lists []PostList `yaml:"lists"` PrimaryListInclude []string `yaml:"primary_list_include"` + HeaderMenu []MenuItem `yaml:"header_menu"` } type PostList struct { @@ -36,6 +37,12 @@ type PostList struct { Include []string `yaml:"include"` } +type MenuItem struct { + Title string `yaml:"title"` + List string `yaml:"list"` + Url string `yaml:"url"` +} + func (l *PostList) ContainsType(t string) bool { for _, t2 := range l.Include { if t2 == t { @@ -390,6 +397,12 @@ func (user User) AddPostList(list PostList) error { return user.SetConfig(config) } +func (user User) AddHeaderMenuItem(link MenuItem) error { + config := user.Config() + config.HeaderMenu = append(config.HeaderMenu, link) + return user.SetConfig(config) +} + func (user User) ResetPassword(password string) error { bytes, err := bcrypt.GenerateFromPassword([]byte(password), 10) if err != nil {