Browse Source

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.
master
Simon Ser 4 years ago
parent
commit
3748b4413e
No known key found for this signature in database GPG Key ID: FDE7BE0E88F5E48
2 changed files with 40 additions and 7 deletions
  1. +8
    -7
      handlers.go
  2. +32
    -0
      template.go

+ 8
- 7
handlers.go 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{}),
})
}

+ 32
- 0
template.go 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


Loading…
Cancel
Save