From 3748b4413e6962654162625a3e57ade91defb71b Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 10 Dec 2019 17:36:21 +0100 Subject: [PATCH] Introduce GlobalRenderData and RenderData GlobalRenderData contains some global metadata that can be obtained from any template. RenderData is a base type for template data. It contains a Global field with global metadata and an Extra field for plugins. --- handlers.go | 15 ++++++++------- template.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/handlers.go b/handlers.go index 4e127b4..de324fa 100644 --- a/handlers.go +++ b/handlers.go @@ -17,11 +17,11 @@ import ( ) type MailboxRenderData struct { + RenderData Mailbox *imap.MailboxStatus Mailboxes []*imap.MailboxInfo Messages []imapMessage PrevPage, NextPage int - Extra map[string]interface{} } func handleGetMailbox(ectx echo.Context) error { @@ -67,17 +67,18 @@ func handleGetMailbox(ectx echo.Context) error { } return ctx.Render(http.StatusOK, "mailbox.html", &MailboxRenderData{ + RenderData: *NewRenderData(ctx), Mailbox: mbox, Mailboxes: mailboxes, Messages: msgs, PrevPage: prevPage, NextPage: nextPage, - Extra: make(map[string]interface{}), }) } func handleLogin(ectx echo.Context) error { ctx := ectx.(*context) + username := ctx.FormValue("username") password := ctx.FormValue("password") if username != "" && password != "" { @@ -93,7 +94,7 @@ func handleLogin(ectx echo.Context) error { return ctx.Redirect(http.StatusFound, "/mailbox/INBOX") } - return ctx.Render(http.StatusOK, "login.html", nil) + return ctx.Render(http.StatusOK, "login.html", NewRenderData(ctx)) } func handleLogout(ectx echo.Context) error { @@ -105,12 +106,12 @@ func handleLogout(ectx echo.Context) error { } type MessageRenderData struct { + RenderData Mailbox *imap.MailboxStatus Message *imapMessage Body string PartPath string MailboxPage int - Extra map[string]interface{} } func handleGetPart(ctx *context, raw bool) error { @@ -172,18 +173,18 @@ func handleGetPart(ctx *context, raw bool) error { } return ctx.Render(http.StatusOK, "message.html", &MessageRenderData{ + RenderData: *NewRenderData(ctx), Mailbox: mbox, Message: msg, Body: body, PartPath: partPathString, MailboxPage: int(mbox.Messages-msg.SeqNum) / messagesPerPage, - Extra: make(map[string]interface{}), }) } type ComposeRenderData struct { + RenderData Message *OutgoingMessage - Extra map[string]interface{} } func handleCompose(ectx echo.Context) error { @@ -281,7 +282,7 @@ func handleCompose(ectx echo.Context) error { } return ctx.Render(http.StatusOK, "compose.html", &ComposeRenderData{ + RenderData: *NewRenderData(ctx), Message: &msg, - Extra: make(map[string]interface{}), }) } diff --git a/template.go b/template.go index 110c433..2ebcbc0 100644 --- a/template.go +++ b/template.go @@ -13,6 +13,38 @@ import ( const themesDir = "public/themes" +// GlobalRenderData contains data available in all templates. +type GlobalRenderData struct { + LoggedIn bool + + // if logged in + Username string + // TODO: list of mailboxes + + Extra map[string]interface{} +} + +// RenderData is the base type for templates. It should be extended with new +// template-specific fields. +type RenderData struct { + Global GlobalRenderData + Extra map[string]interface{} +} + +func NewRenderData(ctx *context) *RenderData { + global := GlobalRenderData{Extra: make(map[string]interface{})} + + if ctx.session != nil { + global.LoggedIn = true + global.Username = ctx.session.username + } + + return &RenderData{ + Global: global, + Extra: make(map[string]interface{}), + } +} + type renderer struct { base *template.Template themes map[string]*template.Template