mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2024-10-30 19:56:16 +00:00
b1cdb1e279
All the remaining QTPL files were spread across the codebase. The plan is to get rid of them step by step and migrate to the new l10n approach, all based on Go std templates.
202 lines
7.0 KiB
Plaintext
202 lines
7.0 KiB
Plaintext
{% import "net/http" %}
|
|
{% import "sort" %}
|
|
{% import "github.com/bouncepaw/mycorrhiza/cfg" %}
|
|
{% import "github.com/bouncepaw/mycorrhiza/l18n" %}
|
|
{% import "github.com/bouncepaw/mycorrhiza/user" %}
|
|
|
|
{% func Register(rq *http.Request) %}
|
|
{% code
|
|
lc := l18n.FromRequest(rq)
|
|
%}
|
|
<main class="main-width">
|
|
<section>
|
|
{% if cfg.AllowRegistration %}
|
|
<form class="modal" method="post" action="/register?{%s rq.URL.RawQuery %}" id="register-form" enctype="multipart/form-data" autocomplete="off">
|
|
<fieldset class="modal__fieldset">
|
|
<legend class="modal__title">{%s lc.Get("auth.register_header", &l18n.Replacements{"name": cfg.WikiName}) %}</legend>
|
|
|
|
<label for="register-form__username">{%s lc.Get("auth.username") %}</label>
|
|
<br>
|
|
<input type="text" required autofocus id="login-form__username" name="username">
|
|
<br>
|
|
<label for="login-form__password">{%s lc.Get("auth.password") %}</label>
|
|
<br>
|
|
<input type="password" required name="password">
|
|
<p>{%s lc.Get("auth.password_tip") %}</p>
|
|
<p>{%s lc.Get("auth.cookie_tip") %}</p>
|
|
<button class="btn" type="submit" value="Register">{%s lc.Get("auth.register_button") %}</button>
|
|
<a class="btn btn_weak" href="/{%s rq.URL.RawQuery %}">{%s lc.Get("ui.cancel") %}</a>
|
|
</fieldset>
|
|
</form>
|
|
{%= telegramWidget(lc) %}
|
|
{% elseif cfg.UseAuth %}
|
|
<p>{%s lc.Get("auth.noregister") %}</p>
|
|
<p><a href="/{%s rq.URL.RawQuery %}">← {%s lc.Get("auth.go_back") %}</a></p>
|
|
{% else %}
|
|
<p>{%s lc.Get("auth.noauth") %}</p>
|
|
<p><a href="/{%s rq.URL.RawQuery %}">← {%s lc.Get("auth.go_back") %}</a></p>
|
|
{% endif %}
|
|
</section>
|
|
</main>
|
|
{% endfunc %}
|
|
|
|
{% func Login(lc *l18n.Localizer) %}
|
|
<main class="main-width">
|
|
<section>
|
|
{% if cfg.UseAuth %}
|
|
<form class="modal" method="post" action="/login" id="login-form" enctype="multipart/form-data" autocomplete="on">
|
|
<fieldset class="modal__fieldset">
|
|
<legend class="modal__title">{%s lc.Get("auth.login_header", &l18n.Replacements{"name": cfg.WikiName}) %}</legend>
|
|
<label for="login-form__username">{%s lc.Get("auth.username") %}</label>
|
|
<br>
|
|
<input type="text" required autofocus id="login-form__username" name="username" autocomplete="username">
|
|
<br>
|
|
<label for="login-form__password">{%s lc.Get("auth.password") %}</label>
|
|
<br>
|
|
<input type="password" required name="password" autocomplete="current-password">
|
|
<p>{%s lc.Get("auth.cookie_tip") %}</p>
|
|
<button class="btn" type="submit" value="Log in">{%s lc.Get("auth.login_button") %}</button>
|
|
<a class="btn btn_weak" href="/">{%s lc.Get("ui.cancel") %}</a>
|
|
</fieldset>
|
|
</form>
|
|
{%= telegramWidget(lc) %}
|
|
{% else %}
|
|
<p>{%s lc.Get("auth.noauth") %}</p>
|
|
<p><a class="btn btn_weak" href="/">← {%s lc.Get("auth.go_home") %}</a></p>
|
|
{% endif %}
|
|
</section>
|
|
</main>
|
|
{% endfunc %}
|
|
|
|
Telegram auth widget was requested by Yogurt. As you can see, we don't offer user administrators control over it. Of course we don't.
|
|
{% func telegramWidget(lc *l18n.Localizer) %}
|
|
{% if cfg.TelegramEnabled %}
|
|
<p class="telegram-notice">{%s lc.Get("auth.telegram_tip") %}</p>
|
|
<script async src="https://telegram.org/js/telegram-widget.js?15" data-telegram-login="{%s cfg.TelegramBotName %}" data-size="medium" data-userpic="false" data-auth-url="{%s cfg.URL %}/telegram-login"></script>
|
|
{% endif %}
|
|
{% endfunc %}
|
|
|
|
{% func LoginError(err string, lc *l18n.Localizer) %}
|
|
<main class="main-width">
|
|
<section>
|
|
{% switch err %}
|
|
{% case "unknown username" %}
|
|
<p class="error">{%s lc.Get("auth.error_username") %}</p>
|
|
{% case "wrong password" %}
|
|
<p class="error">{%s lc.Get("auth.error_password") %}</p>
|
|
{% default %}
|
|
<p class="error">{%s err %}</p>
|
|
{% endswitch %}
|
|
<p><a href="/login">← {%s lc.Get("auth.try_again") %}</a></p>
|
|
</section>
|
|
</main>
|
|
{% endfunc %}
|
|
|
|
{% func Logout(can bool, lc *l18n.Localizer) %}
|
|
<main class="main-width">
|
|
<section>
|
|
{% if can %}
|
|
<h1>{%s lc.Get("auth.logout_header") %}</h1>
|
|
<form method="POST" action="/logout">
|
|
<input class="btn btn_accent" type="submit" value="{%s lc.Get("auth.logout_button") %}"/>
|
|
<a class="btn btn_weak" href="/">{%s lc.Get("auth.go_home") %}</a>
|
|
</form>
|
|
{% else %}
|
|
<p>{%s lc.Get("auth.logout_anon") %}</p>
|
|
<p><a href="/login">{%s lc.Get("auth.login_title") %}</a></p>
|
|
<p><a href="/">← {%s lc.Get("auth.go_home") %}</a></p>
|
|
{% endif %}
|
|
</section>
|
|
</main>
|
|
{% endfunc %}
|
|
|
|
{% func Lock(lc *l18n.Localizer) %}
|
|
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>🔒 {%s lc.Get("auth.lock_title") %}</title>
|
|
<link rel="shortcut icon" href="/static/favicon.ico">
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
</head>
|
|
<body>
|
|
<main class="locked-notice">
|
|
<section class="locked-notice__message">
|
|
<p class="locked-notice__lock">🔒</p>
|
|
<h1 class="locked-notice__title">{%s lc.Get("auth.lock_title") %}</h1>
|
|
<form class="locked-notice__login-form" method="post" action="/login" id="login-form" enctype="multipart/form-data" autocomplete="on">
|
|
<label for="login-form__username">{%s lc.Get("auth.username") %}</label>
|
|
<br>
|
|
<input type="text" required autofocus id="login-form__username" name="username" autocomplete="username">
|
|
<br>
|
|
<label for="login-form__password">{%s lc.Get("auth.password") %}</label>
|
|
<br>
|
|
<input type="password" required name="password" autocomplete="current-password">
|
|
<br>
|
|
<button class="btn" type="submit" value="Log in">{%s lc.Get("auth.login_button") %}</button>
|
|
</form>
|
|
{%= telegramWidget(lc) %}
|
|
</section>
|
|
</main>
|
|
</body>
|
|
</html>
|
|
{% endfunc %}
|
|
|
|
{% code
|
|
var userListL10n = map[string]L10nEntry{
|
|
"heading": En("List of users").Ru("Список пользователей"),
|
|
"administrators": En("Administrators").Ru("Администраторы"),
|
|
"moderators": En("Moderators").Ru("Модераторы"),
|
|
"editors": En("Editors").Ru("Редакторы"),
|
|
}
|
|
%}
|
|
|
|
{% func UserList(lc *l18n.Localizer) %}
|
|
<main class="main-width user-list">
|
|
{% code
|
|
var get = func(key string) string {
|
|
return userListL10n[key].Get(lc.Locale)
|
|
}
|
|
|
|
var (
|
|
admins = make([]string, 0)
|
|
moderators = make([]string, 0)
|
|
editors = make([]string, 0)
|
|
)
|
|
for u := range user.YieldUsers() {
|
|
switch u.Group {
|
|
// What if we place the users into sorted slices?
|
|
case "admin":
|
|
admins = append(admins, u.Name)
|
|
case "moderator":
|
|
moderators = append(moderators, u.Name)
|
|
case "editor", "trusted":
|
|
editors = append(editors, u.Name)
|
|
}
|
|
}
|
|
sort.Strings(admins)
|
|
sort.Strings(moderators)
|
|
sort.Strings(editors)
|
|
%}
|
|
<h1>{%s get("heading") %}</h1>
|
|
<section>
|
|
<h2>{%s get("administrators") %}</h2>
|
|
<ol>{% for _, name := range admins %}
|
|
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
|
|
{% endfor %}</ol>
|
|
</section>
|
|
<section>
|
|
<h2>{%s get("moderators") %}</h2>
|
|
<ol>{% for _, name := range moderators %}
|
|
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
|
|
{% endfor %}</ol>
|
|
</section>
|
|
<section>
|
|
<h2>{%s get("editors") %}</h2>
|
|
<ol>{% for _, name := range editors %}
|
|
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
|
|
{% endfor %}</ol>
|
|
</section>
|
|
</main>
|
|
{% endfunc %} |