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.
This commit is contained in:
Simon Ser 2019-12-10 17:36:21 +01:00
parent edf738f23d
commit 3748b4413e
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
2 changed files with 40 additions and 7 deletions

View file

@ -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{}),
})
}

View file

@ -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