mirror of
https://github.com/writefreely/writefreely
synced 2024-11-10 11:24:13 +00:00
Enable customizing Reader page
This makes it possible to edit the title and introductory text at the top of the Reader view. Ref T684
This commit is contained in:
parent
cb28c95689
commit
7b42efb9d9
6 changed files with 52 additions and 5 deletions
7
admin.go
7
admin.go
|
@ -319,6 +319,8 @@ func handleViewAdminPage(app *App, u *User, w http.ResponseWriter, r *http.Reque
|
|||
}
|
||||
p.Content, err = getLandingBody(app)
|
||||
p.Content.ID = "landing"
|
||||
} else if slug == "reader" {
|
||||
p.Content, err = getReaderSection(app)
|
||||
} else {
|
||||
p.Content, err = app.db.GetDynamicContent(slug)
|
||||
}
|
||||
|
@ -342,7 +344,7 @@ func handleAdminUpdateSite(app *App, u *User, w http.ResponseWriter, r *http.Req
|
|||
id := vars["page"]
|
||||
|
||||
// Validate
|
||||
if id != "about" && id != "privacy" && id != "landing" {
|
||||
if id != "about" && id != "privacy" && id != "landing" && id != "reader" {
|
||||
return impart.HTTPError{http.StatusNotFound, "No such page."}
|
||||
}
|
||||
|
||||
|
@ -356,6 +358,9 @@ func handleAdminUpdateSite(app *App, u *User, w http.ResponseWriter, r *http.Req
|
|||
return impart.HTTPError{http.StatusFound, "/admin/page/" + id + m}
|
||||
}
|
||||
err = app.db.UpdateDynamicContent("landing-body", "", r.FormValue("content"), "section")
|
||||
} else if id == "reader" {
|
||||
// Update sections with titles
|
||||
err = app.db.UpdateDynamicContent(id, r.FormValue("title"), r.FormValue("content"), "section")
|
||||
} else {
|
||||
// Update page
|
||||
err = app.db.UpdateDynamicContent(id, r.FormValue("title"), r.FormValue("content"), "page")
|
||||
|
|
27
pages.go
27
pages.go
|
@ -135,3 +135,30 @@ WriteFreely can communicate with other federated platforms like Mastodon, so peo
|
|||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func getReaderSection(app *App) (*instanceContent, error) {
|
||||
c, err := app.db.GetDynamicContent("reader")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if c == nil {
|
||||
c = &instanceContent{
|
||||
ID: "reader",
|
||||
Type: "section",
|
||||
Content: defaultReaderBanner(app.cfg),
|
||||
Updated: defaultPageUpdatedTime,
|
||||
}
|
||||
}
|
||||
if !c.Title.Valid {
|
||||
c.Title = defaultReaderTitle(app.cfg)
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func defaultReaderTitle(cfg *config.Config) sql.NullString {
|
||||
return sql.NullString{String: "Reader", Valid: true}
|
||||
}
|
||||
|
||||
func defaultReaderBanner(cfg *config.Config) string {
|
||||
return "Read the latest posts from " + cfg.App.SiteName + "."
|
||||
}
|
||||
|
|
12
read.go
12
read.go
|
@ -50,6 +50,10 @@ type readPublication struct {
|
|||
SelTopic string
|
||||
IsAdmin bool
|
||||
CanInvite bool
|
||||
|
||||
// Customizable page content
|
||||
ContentTitle string
|
||||
Content template.HTML
|
||||
}
|
||||
|
||||
func initLocalTimeline(app *App) {
|
||||
|
@ -211,8 +215,14 @@ func showLocalTimeline(app *App, w http.ResponseWriter, r *http.Request, page in
|
|||
d.IsAdmin = u != nil && u.IsAdmin()
|
||||
d.CanInvite = canUserInvite(app.cfg, d.IsAdmin)
|
||||
}
|
||||
c, err := getReaderSection(app)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
d.ContentTitle = c.Title.String
|
||||
d.Content = template.HTML(applyMarkdown([]byte(c.Content), "", app.cfg))
|
||||
|
||||
err := templates["read"].ExecuteTemplate(w, "base", d)
|
||||
err = templates["read"].ExecuteTemplate(w, "base", d)
|
||||
if err != nil {
|
||||
log.Error("Unable to render reader: %v", err)
|
||||
fmt.Fprintf(w, ":(")
|
||||
|
|
|
@ -80,8 +80,8 @@
|
|||
{{define "body-attrs"}}id="collection"{{end}}
|
||||
{{define "content"}}
|
||||
<div class="content-container snug" style="max-width: 40rem;">
|
||||
<h1 style="text-align:center">Reader</h1>
|
||||
<p{{if .SelTopic}} style="text-align:center"{{end}}>{{if .SelTopic}}#{{.SelTopic}} posts{{else}}Read the latest posts from {{.SiteName}}. {{if .Username}}To showcase your writing here, go to your <a href="/me/c/">blog</a> settings and select the <em>Public</em> option.{{end}}{{end}}</p>
|
||||
<h1>{{.ContentTitle}}</h1>
|
||||
<p{{if .SelTopic}} style="text-align:center"{{end}}>{{if .SelTopic}}#{{.SelTopic}} posts{{else}}{{.Content}}{{end}}</p>
|
||||
</div>
|
||||
<div id="wrapper">
|
||||
{{ if gt (len .Posts) 0 }}
|
||||
|
|
|
@ -20,6 +20,9 @@ table.classy.export .disabled, table.classy.export a {
|
|||
<tr>
|
||||
<td colspan="2"><a href="/admin/page/landing">Home</a></td>
|
||||
</tr>
|
||||
{{if .LocalTimeline}}<tr>
|
||||
<td colspan="2"><a href="/admin/page/reader">Reader</a></td>
|
||||
</tr>{{end}}
|
||||
{{range .Pages}}
|
||||
<tr>
|
||||
<td><a href="/admin/page/{{.ID}}">{{if .Title.Valid}}{{.Title.String}}{{else}}{{.ID}}{{end}}</a></td>
|
||||
|
|
|
@ -31,6 +31,8 @@ input[type=text] {
|
|||
<p class="page-desc content-desc">Describe what your instance is <a href="/about" target="page">about</a>.</p>
|
||||
{{else if eq .Content.ID "privacy"}}
|
||||
<p class="page-desc content-desc">Outline your <a href="/privacy" target="page">privacy policy</a>.</p>
|
||||
{{else if eq .Content.ID "reader"}}
|
||||
<p class="page-desc content-desc">Customize your <a href="/read" target="page">Reader</a> page.</p>
|
||||
{{else if eq .Content.ID "landing"}}
|
||||
<p class="page-desc content-desc">Customize your <a href="/?landing=1" target="page">home page</a>.</p>
|
||||
{{end}}
|
||||
|
@ -38,7 +40,7 @@ input[type=text] {
|
|||
{{if .Message}}<p>{{.Message}}</p>{{end}}
|
||||
|
||||
<form method="post" action="/admin/update/{{.Content.ID}}" onsubmit="savePage(this)">
|
||||
{{if eq .Content.Type "section"}}
|
||||
{{if .Banner}}
|
||||
<label for="banner">
|
||||
Banner
|
||||
</label>
|
||||
|
|
Loading…
Reference in a new issue