aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2019-12-10 17:36:21 +0100
committerSimon Ser <contact@emersion.fr>2019-12-10 17:36:21 +0100
commit3748b4413e6962654162625a3e57ade91defb71b (patch)
tree29e9eabe6122dd5ba06c3df50863b748e0e01566
parentedf738f23d96efdd2c96146d430301a3128cb8e9 (diff)
downloadalps-3748b4413e6962654162625a3e57ade91defb71b.tar.gz
alps-3748b4413e6962654162625a3e57ade91defb71b.zip
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.
-rw-r--r--handlers.go15
-rw-r--r--template.go32
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