mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2025-01-21 07:46:52 +00:00
Add log out link to current user's profile
For the first time, you can log out from Mycorrhiza!
This commit is contained in:
parent
9ade6a34e0
commit
c69d4946ec
@ -189,6 +189,7 @@ var localizations = map[string]string{
|
||||
"en.ui.list_heading": "List of hyphae",
|
||||
"en.ui.list_title": "List of pages",
|
||||
"en.ui.login": "Login",
|
||||
"en.ui.logout_link": "Log out",
|
||||
"en.ui.media_download": "Download media",
|
||||
"en.ui.media_noaudio": "Your browser does not support audio.",
|
||||
"en.ui.media_noaudio_link": "Download audio",
|
||||
@ -427,6 +428,7 @@ var localizations = map[string]string{
|
||||
"ru.ui.list_heading": "Список гиф",
|
||||
"ru.ui.list_title": "Список страниц",
|
||||
"ru.ui.login": "Войти",
|
||||
"ru.ui.logout_link": "Выйти",
|
||||
"ru.ui.media_download": "Скачать медиа",
|
||||
"ru.ui.media_noaudio": "Ваш браузер не поддерживает аудио.",
|
||||
"ru.ui.media_noaudio_link": "Скачать аудио",
|
||||
|
@ -19,6 +19,7 @@
|
||||
"list_desc+other": "hyphae",
|
||||
|
||||
"edit_link": "Edit text",
|
||||
"logout_link": "Log out",
|
||||
"history_link": "View history",
|
||||
"rename_link": "Rename",
|
||||
"delete_link": "Delete",
|
||||
|
@ -20,6 +20,7 @@
|
||||
"list_desc+many": "гиф",
|
||||
|
||||
"edit_link": "Редактировать",
|
||||
"logout_link": "Выйти",
|
||||
"history_link": "История",
|
||||
"rename_link": "Переименовать",
|
||||
"delete_link": "Удалить",
|
||||
|
@ -778,12 +778,12 @@ kbd {
|
||||
/*
|
||||
* Buttons beside the hypha title
|
||||
*/
|
||||
.edit-btn {
|
||||
.btn_navititle {
|
||||
float: right;
|
||||
margin: -0.25rem 0;
|
||||
padding: 0;
|
||||
}
|
||||
.edit-btn__link {
|
||||
.btn__link_navititle {
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
|
@ -64,6 +64,13 @@ func CanonicalName(name string) string {
|
||||
return util.CanonicalName(name)
|
||||
}
|
||||
|
||||
// IsProfileName if the given hypha name is a profile name. It takes configuration into consideration.
|
||||
//
|
||||
// With default configuration, u/ is the prefix such names have. For example, u/wikimind matches. Note that u/wikimind/sub does not.
|
||||
func IsProfileName(hyphaName string) bool {
|
||||
return strings.HasPrefix(hyphaName, cfg.UserHypha+"/") && strings.Count(hyphaName, "/") == 1
|
||||
}
|
||||
|
||||
// HyphaNameFromRq extracts hypha name from http request. You have to also pass the action which is embedded in the url or several actions. For url /hypha/hypha, the action would be "hypha".
|
||||
func HyphaNameFromRq(rq *http.Request, actions ...string) string {
|
||||
p := rq.URL.Path
|
||||
|
@ -91,9 +91,15 @@ If you rename .prevnext, change the docs too.
|
||||
<div class="jump-btn">
|
||||
<a class="jump-btn__link" href="#hypha-bottom">↓</a>
|
||||
</div>
|
||||
{% if u.CanProceed("edit") %}<div class="btn edit-btn">
|
||||
<a class="edit-btn__link" href="/edit/{%s h.Name %}">{%s lc.Get("ui.edit_link") %}</a>
|
||||
|
||||
{% if u.CanProceed("edit") %}<div class="btn btn_navititle">
|
||||
<a class="btn__link_navititle" href="/edit/{%s h.Name %}">{%s lc.Get("ui.edit_link") %}</a>
|
||||
</div>{% endif %}
|
||||
|
||||
{% if cfg.UseAuth && util.IsProfileName(h.Name) && u.Name == strings.TrimPrefix(h.Name, cfg.UserHypha + "/") %}<div class="btn btn_navititle">
|
||||
<a class="btn__link_navititle" href="/logout">{%s lc.Get("ui.logout_link") %}</a>
|
||||
</div>{% endif %}
|
||||
|
||||
{%s= NaviTitleHTML(h) %}
|
||||
{% if h.Exists %}
|
||||
{%s= contents %}
|
||||
@ -144,4 +150,4 @@ If you rename .prevnext, change the docs too.
|
||||
{% for _, scriptPath := range cfg.ViewScripts %}
|
||||
<script src="{%s scriptPath %}"></script>
|
||||
{% endfor %}
|
||||
{% endfunc %}
|
||||
{% endfunc %}
|
||||
|
@ -319,286 +319,304 @@ func StreamHyphaHTML(qw422016 *qt422016.Writer, rq *http.Request, lc *l18n.Local
|
||||
<div class="jump-btn">
|
||||
<a class="jump-btn__link" href="#hypha-bottom">↓</a>
|
||||
</div>
|
||||
|
||||
`)
|
||||
//line views/readers.qtpl:94
|
||||
//line views/readers.qtpl:95
|
||||
if u.CanProceed("edit") {
|
||||
//line views/readers.qtpl:94
|
||||
qw422016.N().S(`<div class="btn edit-btn">
|
||||
<a class="edit-btn__link" href="/edit/`)
|
||||
//line views/readers.qtpl:95
|
||||
qw422016.N().S(`<div class="btn btn_navititle">
|
||||
<a class="btn__link_navititle" href="/edit/`)
|
||||
//line views/readers.qtpl:96
|
||||
qw422016.E().S(h.Name)
|
||||
//line views/readers.qtpl:95
|
||||
//line views/readers.qtpl:96
|
||||
qw422016.N().S(`">`)
|
||||
//line views/readers.qtpl:95
|
||||
//line views/readers.qtpl:96
|
||||
qw422016.E().S(lc.Get("ui.edit_link"))
|
||||
//line views/readers.qtpl:95
|
||||
//line views/readers.qtpl:96
|
||||
qw422016.N().S(`</a>
|
||||
</div>`)
|
||||
//line views/readers.qtpl:96
|
||||
//line views/readers.qtpl:97
|
||||
}
|
||||
//line views/readers.qtpl:96
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:97
|
||||
qw422016.N().S(`
|
||||
|
||||
`)
|
||||
//line views/readers.qtpl:99
|
||||
if cfg.UseAuth && util.IsProfileName(h.Name) && u.Name == strings.TrimPrefix(h.Name, cfg.UserHypha+"/") {
|
||||
//line views/readers.qtpl:99
|
||||
qw422016.N().S(`<div class="btn btn_navititle">
|
||||
<a class="btn__link_navititle" href="/logout">`)
|
||||
//line views/readers.qtpl:100
|
||||
qw422016.E().S(lc.Get("ui.logout_link"))
|
||||
//line views/readers.qtpl:100
|
||||
qw422016.N().S(`</a>
|
||||
</div>`)
|
||||
//line views/readers.qtpl:101
|
||||
}
|
||||
//line views/readers.qtpl:101
|
||||
qw422016.N().S(`
|
||||
|
||||
`)
|
||||
//line views/readers.qtpl:103
|
||||
qw422016.N().S(NaviTitleHTML(h))
|
||||
//line views/readers.qtpl:97
|
||||
//line views/readers.qtpl:103
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:98
|
||||
//line views/readers.qtpl:104
|
||||
if h.Exists {
|
||||
//line views/readers.qtpl:98
|
||||
//line views/readers.qtpl:104
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:99
|
||||
//line views/readers.qtpl:105
|
||||
qw422016.N().S(contents)
|
||||
//line views/readers.qtpl:99
|
||||
//line views/readers.qtpl:105
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:100
|
||||
//line views/readers.qtpl:106
|
||||
} else {
|
||||
//line views/readers.qtpl:100
|
||||
//line views/readers.qtpl:106
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:101
|
||||
//line views/readers.qtpl:107
|
||||
streamnonExistentHyphaNotice(qw422016, h, u, lc)
|
||||
//line views/readers.qtpl:101
|
||||
//line views/readers.qtpl:107
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:102
|
||||
//line views/readers.qtpl:108
|
||||
}
|
||||
//line views/readers.qtpl:102
|
||||
//line views/readers.qtpl:108
|
||||
qw422016.N().S(`
|
||||
</section>
|
||||
<section class="prevnext">
|
||||
`)
|
||||
//line views/readers.qtpl:105
|
||||
//line views/readers.qtpl:111
|
||||
if prevHyphaName != "" {
|
||||
//line views/readers.qtpl:105
|
||||
//line views/readers.qtpl:111
|
||||
qw422016.N().S(`
|
||||
<a class="prevnext__el prevnext__prev" href="/hypha/`)
|
||||
//line views/readers.qtpl:106
|
||||
//line views/readers.qtpl:112
|
||||
qw422016.E().S(prevHyphaName)
|
||||
//line views/readers.qtpl:106
|
||||
//line views/readers.qtpl:112
|
||||
qw422016.N().S(`" rel="prev">← `)
|
||||
//line views/readers.qtpl:106
|
||||
//line views/readers.qtpl:112
|
||||
qw422016.E().S(util.BeautifulName(path.Base(prevHyphaName)))
|
||||
//line views/readers.qtpl:106
|
||||
//line views/readers.qtpl:112
|
||||
qw422016.N().S(`</a>
|
||||
`)
|
||||
//line views/readers.qtpl:107
|
||||
//line views/readers.qtpl:113
|
||||
}
|
||||
//line views/readers.qtpl:107
|
||||
//line views/readers.qtpl:113
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:108
|
||||
//line views/readers.qtpl:114
|
||||
if nextHyphaName != "" {
|
||||
//line views/readers.qtpl:108
|
||||
//line views/readers.qtpl:114
|
||||
qw422016.N().S(`
|
||||
<a class="prevnext__el prevnext__next" href="/hypha/`)
|
||||
//line views/readers.qtpl:109
|
||||
//line views/readers.qtpl:115
|
||||
qw422016.E().S(nextHyphaName)
|
||||
//line views/readers.qtpl:109
|
||||
//line views/readers.qtpl:115
|
||||
qw422016.N().S(`" rel="next">`)
|
||||
//line views/readers.qtpl:109
|
||||
//line views/readers.qtpl:115
|
||||
qw422016.E().S(util.BeautifulName(path.Base(nextHyphaName)))
|
||||
//line views/readers.qtpl:109
|
||||
//line views/readers.qtpl:115
|
||||
qw422016.N().S(` →</a>
|
||||
`)
|
||||
//line views/readers.qtpl:110
|
||||
//line views/readers.qtpl:116
|
||||
}
|
||||
//line views/readers.qtpl:110
|
||||
//line views/readers.qtpl:116
|
||||
qw422016.N().S(`
|
||||
</section>
|
||||
`)
|
||||
//line views/readers.qtpl:112
|
||||
//line views/readers.qtpl:118
|
||||
StreamSubhyphaeHTML(qw422016, subhyphae, lc)
|
||||
//line views/readers.qtpl:112
|
||||
//line views/readers.qtpl:118
|
||||
qw422016.N().S(`
|
||||
<section id="hypha-bottom">
|
||||
<div class="jump-btn">
|
||||
<a class="jump-btn__link" href="#hypha">↑</a>
|
||||
</div>
|
||||
`)
|
||||
//line views/readers.qtpl:117
|
||||
//line views/readers.qtpl:123
|
||||
streamhyphaInfo(qw422016, rq, h)
|
||||
//line views/readers.qtpl:117
|
||||
//line views/readers.qtpl:123
|
||||
qw422016.N().S(`
|
||||
</section>
|
||||
</main>
|
||||
`)
|
||||
//line views/readers.qtpl:120
|
||||
//line views/readers.qtpl:126
|
||||
streamsiblingHyphaeHTML(qw422016, siblings, lc)
|
||||
//line views/readers.qtpl:120
|
||||
//line views/readers.qtpl:126
|
||||
qw422016.N().S(`
|
||||
</div>
|
||||
`)
|
||||
//line views/readers.qtpl:122
|
||||
//line views/readers.qtpl:128
|
||||
streamviewScripts(qw422016)
|
||||
//line views/readers.qtpl:122
|
||||
//line views/readers.qtpl:128
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
func WriteHyphaHTML(qq422016 qtio422016.Writer, rq *http.Request, lc *l18n.Localizer, h *hyphae.Hypha, contents string) {
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
StreamHyphaHTML(qw422016, rq, lc, h, contents)
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
func HyphaHTML(rq *http.Request, lc *l18n.Localizer, h *hyphae.Hypha, contents string) string {
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
WriteHyphaHTML(qb422016, rq, lc, h, contents)
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
qs422016 := string(qb422016.B)
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
return qs422016
|
||||
//line views/readers.qtpl:123
|
||||
//line views/readers.qtpl:129
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:125
|
||||
//line views/readers.qtpl:131
|
||||
func StreamRevisionHTML(qw422016 *qt422016.Writer, rq *http.Request, lc *l18n.Localizer, h *hyphae.Hypha, contents, revHash string) {
|
||||
//line views/readers.qtpl:125
|
||||
//line views/readers.qtpl:131
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:127
|
||||
//line views/readers.qtpl:133
|
||||
siblings, subhyphae, _, _ := tree.Tree(h.Name)
|
||||
|
||||
//line views/readers.qtpl:128
|
||||
//line views/readers.qtpl:134
|
||||
qw422016.N().S(`
|
||||
<div class="layout">
|
||||
<main class="main-width">
|
||||
<section>
|
||||
<p>`)
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.E().S(lc.Get("ui.revision_warning"))
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.N().S(` <a href="/rev-text/`)
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.E().S(revHash)
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.N().S(`/`)
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.E().S(h.Name)
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.N().S(`">`)
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.E().S(lc.Get("ui.revision_link"))
|
||||
//line views/readers.qtpl:132
|
||||
//line views/readers.qtpl:138
|
||||
qw422016.N().S(`</a></p>
|
||||
`)
|
||||
//line views/readers.qtpl:133
|
||||
//line views/readers.qtpl:139
|
||||
qw422016.N().S(NaviTitleHTML(h))
|
||||
//line views/readers.qtpl:133
|
||||
//line views/readers.qtpl:139
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:134
|
||||
//line views/readers.qtpl:140
|
||||
qw422016.N().S(contents)
|
||||
//line views/readers.qtpl:134
|
||||
//line views/readers.qtpl:140
|
||||
qw422016.N().S(`
|
||||
</section>
|
||||
`)
|
||||
//line views/readers.qtpl:136
|
||||
//line views/readers.qtpl:142
|
||||
StreamSubhyphaeHTML(qw422016, subhyphae, lc)
|
||||
//line views/readers.qtpl:136
|
||||
//line views/readers.qtpl:142
|
||||
qw422016.N().S(`
|
||||
</main>
|
||||
`)
|
||||
//line views/readers.qtpl:138
|
||||
//line views/readers.qtpl:144
|
||||
streamsiblingHyphaeHTML(qw422016, siblings, lc)
|
||||
//line views/readers.qtpl:138
|
||||
//line views/readers.qtpl:144
|
||||
qw422016.N().S(`
|
||||
</div>
|
||||
`)
|
||||
//line views/readers.qtpl:140
|
||||
//line views/readers.qtpl:146
|
||||
streamviewScripts(qw422016)
|
||||
//line views/readers.qtpl:140
|
||||
//line views/readers.qtpl:146
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
func WriteRevisionHTML(qq422016 qtio422016.Writer, rq *http.Request, lc *l18n.Localizer, h *hyphae.Hypha, contents, revHash string) {
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
StreamRevisionHTML(qw422016, rq, lc, h, contents, revHash)
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
func RevisionHTML(rq *http.Request, lc *l18n.Localizer, h *hyphae.Hypha, contents, revHash string) string {
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
WriteRevisionHTML(qb422016, rq, lc, h, contents, revHash)
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
qs422016 := string(qb422016.B)
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
return qs422016
|
||||
//line views/readers.qtpl:141
|
||||
//line views/readers.qtpl:147
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:143
|
||||
//line views/readers.qtpl:149
|
||||
func streamviewScripts(qw422016 *qt422016.Writer) {
|
||||
//line views/readers.qtpl:143
|
||||
//line views/readers.qtpl:149
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:144
|
||||
//line views/readers.qtpl:150
|
||||
for _, scriptPath := range cfg.ViewScripts {
|
||||
//line views/readers.qtpl:144
|
||||
//line views/readers.qtpl:150
|
||||
qw422016.N().S(`
|
||||
<script src="`)
|
||||
//line views/readers.qtpl:145
|
||||
//line views/readers.qtpl:151
|
||||
qw422016.E().S(scriptPath)
|
||||
//line views/readers.qtpl:145
|
||||
//line views/readers.qtpl:151
|
||||
qw422016.N().S(`"></script>
|
||||
`)
|
||||
//line views/readers.qtpl:146
|
||||
//line views/readers.qtpl:152
|
||||
}
|
||||
//line views/readers.qtpl:146
|
||||
//line views/readers.qtpl:152
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
func writeviewScripts(qq422016 qtio422016.Writer) {
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
streamviewScripts(qw422016)
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
}
|
||||
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
func viewScripts() string {
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
writeviewScripts(qb422016)
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
qs422016 := string(qb422016.B)
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
return qs422016
|
||||
//line views/readers.qtpl:147
|
||||
//line views/readers.qtpl:153
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user