Update header template and add option for custom css
authorr <r@freesoftwareextremist.com>
Wed, 25 Dec 2019 16:38:47 +0000 (16:38 +0000)
committerr <r@freesoftwareextremist.com>
Wed, 25 Dec 2019 16:38:47 +0000 (16:38 +0000)
16 files changed:
config/config.go
default.conf
main.go
renderer/model.go
service/service.go
static/custom.css [new file with mode: 0644]
templates/about.tmpl
templates/emoji.tmpl
templates/error.tmpl
templates/header.tmpl
templates/homepage.tmpl
templates/notification.tmpl
templates/signin.tmpl
templates/thread.tmpl
templates/timeline.tmpl
templates/user.tmpl

index 844672a5cac6f28b98e89e90c27afe65ce2808e2..17fcecac0bca7426531c566e272ef21663db6c47 100644 (file)
@@ -16,6 +16,7 @@ type config struct {
        StaticDirectory      string
        TemplatesGlobPattern string
        DatabasePath         string
+       CustomCSS            string
        Logfile              string
 }
 
@@ -41,6 +42,7 @@ func getDefaultConfig() *config {
                StaticDirectory:      "static",
                TemplatesGlobPattern: "templates/*",
                DatabasePath:         "database.db",
+               CustomCSS:            "",
                Logfile:              "",
        }
 }
@@ -83,6 +85,8 @@ func Parse(r io.Reader) (c *config, err error) {
                        c.TemplatesGlobPattern = val
                case "database_path":
                        c.DatabasePath = val
+               case "custom_css":
+                       c.CustomCSS = val
                case "logfile":
                        c.Logfile = val
                default:
index a50ad6f61bb7fef72f38a4f798211a0007d56362..eede82b8453921488919677730368457b57cd2b1 100644 (file)
@@ -4,4 +4,5 @@ client_scope=read write follow
 client_website=http://localhost:8080
 static_directory=static
 templates_glob_pattern=templates/*
+#custom_css=custom.css
 database_path=database
diff --git a/main.go b/main.go
index ad629769d3e795c3faba28b04e378b8a10524d06..f9fdc8f3160a1342cbe133e85e2b5ab51614c902 100644 (file)
--- a/main.go
+++ b/main.go
@@ -6,6 +6,7 @@ import (
        "net/http"
        "os"
        "path/filepath"
+       "strings"
        "time"
 
        "web/config"
@@ -52,6 +53,12 @@ func main() {
        sessionRepo := repository.NewSessionRepository(sessionDB)
        appRepo := repository.NewAppRepository(appDB)
 
+       customCSS := config.CustomCSS
+       if !strings.HasPrefix(customCSS, "http://") &&
+               !strings.HasPrefix(customCSS, "https://") {
+               customCSS = "/static/" + customCSS
+       }
+
        var logger *log.Logger
        if len(config.Logfile) < 1 {
                logger = log.New(os.Stdout, "", log.LstdFlags)
@@ -64,7 +71,7 @@ func main() {
                logger = log.New(lf, "", log.LstdFlags)
        }
 
-       s := service.NewService(config.ClientName, config.ClientScope, config.ClientWebsite, renderer, sessionRepo, appRepo)
+       s := service.NewService(config.ClientName, config.ClientScope, config.ClientWebsite, customCSS, renderer, sessionRepo, appRepo)
        s = service.NewAuthService(sessionRepo, appRepo, s)
        s = service.NewLoggingService(logger, s)
        handler := service.NewHandler(s, config.StaticDirectory)
index dfa46b1c0ecb9b351b45e3181584866988b6c98a..4dfac84bd6174f627848490eea64755f4e5ee071 100644 (file)
@@ -5,12 +5,24 @@ import (
        "web/model"
 )
 
+type HeaderData struct {
+       Title             string
+       NotificationCount int
+       CustomCSS         string
+}
+
 type NavbarData struct {
        User              *mastodon.Account
        NotificationCount int
 }
 
+type CommonData struct {
+       HeaderData *HeaderData
+       NavbarData *NavbarData
+}
+
 type TimelineData struct {
+       *CommonData
        Title       string
        Statuses    []*mastodon.Status
        HasNext     bool
@@ -18,36 +30,35 @@ type TimelineData struct {
        HasPrev     bool
        PrevLink    string
        PostContext model.PostContext
-       NavbarData  *NavbarData
 }
 
 type ThreadData struct {
+       *CommonData
        Statuses    []*mastodon.Status
        PostContext model.PostContext
        ReplyMap    map[string][]mastodon.ReplyInfo
-       NavbarData  *NavbarData
 }
 
 type NotificationData struct {
+       *CommonData
        Notifications []*mastodon.Notification
        HasNext       bool
        NextLink      string
-       NavbarData    *NavbarData
 }
 
 type UserData struct {
+       *CommonData
        User       *mastodon.Account
        Statuses   []*mastodon.Status
        HasNext    bool
        NextLink   string
-       NavbarData *NavbarData
 }
 
 type AboutData struct {
-       NavbarData *NavbarData
+       *CommonData
 }
 
 type EmojiData struct {
        Emojis     []*mastodon.Emoji
-       NavbarData *NavbarData
+       CommonData *CommonData
 }
index c268b755870d5621359c23723b0b4d25ac0ce240..ea0d078359771a8103217119d360e88f5dd03b76 100644 (file)
@@ -50,18 +50,20 @@ type service struct {
        clientName    string
        clientScope   string
        clientWebsite string
+       customCSS     string
        renderer      renderer.Renderer
        sessionRepo   model.SessionRepository
        appRepo       model.AppRepository
 }
 
 func NewService(clientName string, clientScope string, clientWebsite string,
-       renderer renderer.Renderer, sessionRepo model.SessionRepository,
+       customCSS string, renderer renderer.Renderer, sessionRepo model.SessionRepository,
        appRepo model.AppRepository) Service {
        return &service{
                clientName:    clientName,
                clientScope:   clientScope,
                clientWebsite: clientWebsite,
+               customCSS:     customCSS,
                renderer:      renderer,
                sessionRepo:   sessionRepo,
                appRepo:       appRepo,
@@ -272,7 +274,7 @@ func (svc *service) ServeTimelinePage(ctx context.Context, client io.Writer,
                DefaultVisibility: c.Session.Settings.DefaultVisibility,
        }
 
-       navbarData, err := svc.getNavbarTemplateData(ctx, client, c)
+       commonData, err := svc.getCommonData(ctx, client, c)
        if err != nil {
                return
        }
@@ -285,7 +287,7 @@ func (svc *service) ServeTimelinePage(ctx context.Context, client io.Writer,
                HasPrev:     hasPrev,
                PrevLink:    prevLink,
                PostContext: postContext,
-               NavbarData:   navbarData,
+               CommonData:  commonData,
        }
 
        err = svc.renderer.RenderTimelinePage(ctx, client, data)
@@ -349,7 +351,7 @@ func (svc *service) ServeThreadPage(ctx context.Context, client io.Writer, c *mo
                addToReplyMap(replyMap, statuses[i].InReplyToID, statuses[i].ID, i+1)
        }
 
-       navbarData, err := svc.getNavbarTemplateData(ctx, client, c)
+       commonData, err := svc.getCommonData(ctx, client, c)
        if err != nil {
                return
        }
@@ -358,7 +360,7 @@ func (svc *service) ServeThreadPage(ctx context.Context, client io.Writer, c *mo
                Statuses:    statuses,
                PostContext: postContext,
                ReplyMap:    replyMap,
-               NavbarData:  navbarData,
+               CommonData:  commonData,
        }
 
        err = svc.renderer.RenderThreadPage(ctx, client, data)
@@ -409,7 +411,7 @@ func (svc *service) ServeNotificationPage(ctx context.Context, client io.Writer,
                nextLink = "/notifications?max_id=" + pg.MaxID
        }
 
-       navbarData, err := svc.getNavbarTemplateData(ctx, client, c)
+       commonData, err := svc.getCommonData(ctx, client, c)
        if err != nil {
                return
        }
@@ -418,7 +420,7 @@ func (svc *service) ServeNotificationPage(ctx context.Context, client io.Writer,
                Notifications: notifications,
                HasNext:       hasNext,
                NextLink:      nextLink,
-               NavbarData:    navbarData,
+               CommonData:    commonData,
        }
        err = svc.renderer.RenderNotificationPage(ctx, client, data)
        if err != nil {
@@ -453,7 +455,7 @@ func (svc *service) ServeUserPage(ctx context.Context, client io.Writer, c *mode
                nextLink = "/user/" + id + "?max_id=" + pg.MaxID
        }
 
-       navbarData, err := svc.getNavbarTemplateData(ctx, client, c)
+       commonData, err := svc.getCommonData(ctx, client, c)
        if err != nil {
                return
        }
@@ -463,7 +465,7 @@ func (svc *service) ServeUserPage(ctx context.Context, client io.Writer, c *mode
                Statuses:   statuses,
                HasNext:    hasNext,
                NextLink:   nextLink,
-               NavbarData: navbarData,
+               CommonData: commonData,
        }
 
        err = svc.renderer.RenderUserPage(ctx, client, data)
@@ -475,13 +477,13 @@ func (svc *service) ServeUserPage(ctx context.Context, client io.Writer, c *mode
 }
 
 func (svc *service) ServeAboutPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
-       navbarData, err := svc.getNavbarTemplateData(ctx, client, c)
+       commonData, err := svc.getCommonData(ctx, client, c)
        if err != nil {
                return
        }
 
        data := &renderer.AboutData{
-               NavbarData: navbarData,
+               CommonData: commonData,
        }
        err = svc.renderer.RenderAboutPage(ctx, client, data)
        if err != nil {
@@ -492,7 +494,7 @@ func (svc *service) ServeAboutPage(ctx context.Context, client io.Writer, c *mod
 }
 
 func (svc *service) ServeEmojiPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
-       navbarData, err := svc.getNavbarTemplateData(ctx, client, c)
+       commonData, err := svc.getCommonData(ctx, client, c)
        if err != nil {
                return
        }
@@ -504,7 +506,7 @@ func (svc *service) ServeEmojiPage(ctx context.Context, client io.Writer, c *mod
 
        data := &renderer.EmojiData{
                Emojis:     emojis,
-               NavbarData: navbarData,
+               CommonData: commonData,
        }
 
        err = svc.renderer.RenderEmojiPage(ctx, client, data)
@@ -515,27 +517,39 @@ func (svc *service) ServeEmojiPage(ctx context.Context, client io.Writer, c *mod
        return
 }
 
-func (svc *service) getNavbarTemplateData(ctx context.Context, client io.Writer, c *model.Client) (data *renderer.NavbarData, err error) {
-       notifications, err := c.GetNotifications(ctx, nil)
-       if err != nil {
-               return
+func (svc *service) getCommonData(ctx context.Context, client io.Writer, c *model.Client) (data *renderer.CommonData, err error) {
+       data = new(renderer.CommonData)
+
+       data.HeaderData = &renderer.HeaderData{
+               Title:             "Web",
+               NotificationCount: 0,
+               CustomCSS:         svc.customCSS,
        }
 
-       var notificationCount int
-       for i := range notifications {
-               if notifications[i].Pleroma != nil && !notifications[i].Pleroma.IsSeen {
-                       notificationCount++
+       if c != nil && c.Session.IsLoggedIn() {
+               notifications, err := c.GetNotifications(ctx, nil)
+               if err != nil {
+                       return nil, err
                }
-       }
 
-       u, err := c.GetAccountCurrentUser(ctx)
-       if err != nil {
-               return
-       }
+               var notificationCount int
+               for i := range notifications {
+                       if notifications[i].Pleroma != nil && !notifications[i].Pleroma.IsSeen {
+                               notificationCount++
+                       }
+               }
+
+               u, err := c.GetAccountCurrentUser(ctx)
+               if err != nil {
+                       return nil, err
+               }
+
+               data.NavbarData = &renderer.NavbarData{
+                       User:              u,
+                       NotificationCount: notificationCount,
+               }
 
-       data = &renderer.NavbarData{
-               User:              u,
-               NotificationCount: notificationCount,
+               data.HeaderData.NotificationCount = notificationCount
        }
 
        return
diff --git a/static/custom.css b/static/custom.css
new file mode 100644 (file)
index 0000000..a1c192a
--- /dev/null
@@ -0,0 +1,3 @@
+html {
+       background: #000000;
+}
index 0b4bea08217ba3f18a20f8637869cd4bcf1e3477..60385010d5d94c5024abca0709edf34484a67bd3 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 {{template "navigation.tmpl" .NavbarData}}
 <div class="page-title"> About </div>
 
index a0cf263a4f1cc217ebf8eb5197a669108bcababa..aba47262ceb665120cf6abac96676d510a30d36c 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 {{template "navigation.tmpl" .NavbarData}}
 <div class="page-title"> Emojis </div>
 
index d4bd817fe7ea8aba7d9e0deb7faeb146f03563d9..0389cdd96848be5e830e772d3d1206909a008b01 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 <div class="page-title"> Error </div>
 <div class="error-text"> {{.}} </div>
 <div>
index 9334e816311406f43727aa64f89265a8f7557a93..8d05014b4203c9da69b42cd9f3fb09b7b4d082a6 100644 (file)
@@ -3,8 +3,11 @@
 <head>
        <meta charset='utf-8'>
        <meta content='width=device-width, initial-scale=1' name='viewport'>
-       <title> Web </title>
-       <link rel="stylesheet" href="/static/main.css" />
+       <title>{{if gt .NotificationCount 0}}({{.NotificationCount}}) {{end}}{{.Title}}</title>
+       <link rel="stylesheet" href="/static/main.css">
+       {{if .CustomCSS}}
+       <link rel="stylesheet" href="{{.CustomCSS}}">
+       {{end}}
        <link rel="stylesheet" href="/static/fonts/fork-awesome.css">
 </head>
 <body>
index 63e613a54a0de4c9b32bbfe166b199db3114bece..5e8e8a0ce00f6da8cf23a52f2e7ba28fd8ce83c2 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 <div class="page-title"> Home </div>
 <a href="/signin"> Signin </a>
 {{template "footer.tmpl"}}
index 259328a6afed0374310def26366b3424fd828b35..c4f6f2890c2f89c86cc7b29cdf76b0751b9c7d37 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 {{template "navigation.tmpl" .NavbarData}}
 <div class="page-title"> Notifications </div>
 
index fb14a667263fb023b9339c103c85016dc2ef7cf2..5dd03f6e616d36e22be53dab08ed43ec1bf33968 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 <div class="page-title"> Signin </div>
 
 <form class="signin-form" action="/signin" method="post">
index afb307b3b9ea5eb2e695692f4e230898af184e7b..7ec0e94a6e5b7e949854c04b55c9ff6146608654 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 {{template "navigation.tmpl" .NavbarData}}
 <div class="page-title"> Thread </div>
 
index 5bff2d087aa7d415433023878c9e3d994b5b989b..b6885010706b06f76ab6d4fbe3cba5728dfbb2af 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 {{template "navigation.tmpl" .NavbarData}}
 <div class="page-title"> {{.Title}} </div>
 
index c7aa1e8148aa09bf4a073f8b6b3f24ed0aee11c2..fa193380884eff6e60414e20193c2f61135b8b7c 100644 (file)
@@ -1,4 +1,4 @@
-{{template "header.tmpl"}}
+{{template "header.tmpl" .HeaderData}}
 {{template "navigation.tmpl" .NavbarData}}
 <div class="page-title"> User </div>