309e1200d0
* Make a distinction between moderators and admins And rework the user list in the moderation interface, to be able to run the same action on many users, and to have a huge list of actions whithout loosing space. * Make user's role an enum + make it impossible for a moderator to escalate privileges With the help of diesel-derive-enum (maybe it could be used in other places too?) Also, moderators are still able to grant or revoke moderation rights to other people, but maybe only admins should be able to do it? * Cargo fmt * copy/pasting is bad * Remove diesel-derive-enum and use an integer instead It was not compatible with both Postgres and SQlite, because for one it generated a schema with the "User_role" type, but for the other it was "Text"… * Reset translations * Use an enum to avoid magic numbers + fix the tests * Reset translations * Fix down.sql
101 lines
5.1 KiB
HTML
101 lines
5.1 KiB
HTML
@use plume_models::CONFIG;
|
|
@use plume_models::instance::Instance;
|
|
@use template_utils::*;
|
|
@use routes::*;
|
|
@use std::path::Path;
|
|
@(ctx: BaseContext, title: String, head: Content, header: Content, content: Content)
|
|
|
|
<!DOCTYPE html>
|
|
<html class="@ctx.2.clone().and_then(|u| u.preferred_theme).unwrap_or_else(|| CONFIG.default_theme.clone())">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>@title ⋅ @i18n!(ctx.1, "Plume")</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<link rel="stylesheet" href="@uri!(plume_static_files: file = Path::new("css").join(ctx.2.clone().and_then(|u| u.preferred_theme).unwrap_or_else(|| CONFIG.default_theme.clone())).join("theme.css"), _build_id = CACHE_NAME)" />
|
|
<link rel="manifest" href="@uri!(instance::web_manifest)" />
|
|
<link rel="icon" type="image/png" href="@uri!(plume_static_files: file = CONFIG.logo.favicon.as_str(), _build_id = CACHE_NAME)">
|
|
<meta content='#282c37' name='theme-color'/>
|
|
@:head()
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<nav id="menu">
|
|
<a href="#" aria-label="@i18n!(ctx.1, "Menu")" title="@i18n!(ctx.1, "Menu")"><i class="icon icon-menu"></i></a>
|
|
</nav>
|
|
<div id="content">
|
|
<nav>
|
|
<a href="@uri!(instance::index)" class="title">
|
|
<img src="@uri!(plume_static_files: file = CONFIG.logo.main.as_str(), _build_id = CACHE_NAME)">
|
|
<p>@i18n!(ctx.1, "Plume")</p>
|
|
</a>
|
|
<hr/>
|
|
@:header()
|
|
</nav>
|
|
<nav>
|
|
@if ctx.2.is_some() {
|
|
<a href="@uri!(search::search: _)">
|
|
<i class="icon icon-search"></i>
|
|
<span class="mobile-label">@i18n!(ctx.1, "Search")</span>
|
|
</a>
|
|
<a href="@uri!(user::dashboard)">
|
|
<i class="icon icon-home" aria-label="@i18n!(ctx.1, "Dashboard")"></i>
|
|
<span class="mobile-label">@i18n!(ctx.1, "Dashboard")</span>
|
|
</a>
|
|
<a href="@uri!(notifications::notifications: page = _)">
|
|
<i class="icon icon-bell" aria-label="@i18n!(ctx.1, "Notifications")"></i>
|
|
<span class="mobile-label">@i18n!(ctx.1, "Notifications")</span>
|
|
</a>
|
|
<a href="@uri!(session::delete)">
|
|
<i class="icon icon-log-out" aria-label="@i18n!(ctx.1, "Log Out")"></i>
|
|
<span class="mobile-label">@i18n!(ctx.1, "Log Out")</span>
|
|
</a>
|
|
<a href="@uri!(user::me)" title="@i18n!(ctx.1, "My account")">
|
|
@avatar(ctx.0, &ctx.2.clone().unwrap(), Size::Small, false, &ctx.1)
|
|
<span class="mobile-label">@i18n!(ctx.1, "My account")</span>
|
|
</a>
|
|
} else {
|
|
<a href="@uri!(search::search: _)">
|
|
<i class="icon icon-search"></i>
|
|
<span class="mobile-label">@i18n!(ctx.1, "Search")</span>
|
|
</a>
|
|
<a href="@uri!(session::new: m = _)">
|
|
<i class="icon icon-log-in"></i>
|
|
<span class="mobile-label">@i18n!(ctx.1, "Log In")</span>
|
|
</a>
|
|
<a href="@uri!(user::new)">
|
|
<i class="icon icon-user-plus"></i>
|
|
<span class="mobile-label">@i18n!(ctx.1, "Register")</span>
|
|
</a>
|
|
}
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
<div class="messages">
|
|
@if let Some(ref message) = ctx.3 {
|
|
<p class="flash-message @message.0">@message.1</p>
|
|
}
|
|
</div>
|
|
<main>
|
|
@:content()
|
|
</main>
|
|
<footer>
|
|
<hr/>
|
|
<div>
|
|
<h3>@Instance::get_local().map(|i| i.name).unwrap_or_default()</h3>
|
|
<a href="@uri!(instance::about)">@i18n!(ctx.1, "About this instance")</a>
|
|
<a href="@uri!(instance::privacy)">@i18n!(ctx.1, "Privacy policy")</a>
|
|
@if ctx.2.clone().map(|u| u.is_admin()).unwrap_or(false) {
|
|
<a href="@uri!(instance::admin)">@i18n!(ctx.1, "Administration")</a>
|
|
}
|
|
</div>
|
|
<div>
|
|
<h3>@concat!("Plume ", env!("CARGO_PKG_VERSION"))</h3>
|
|
<a href="https://docs.joinplu.me">@i18n!(ctx.1, "Documentation")</a>
|
|
<a href="https://github.com/Plume-org/Plume">@i18n!(ctx.1, "Source code")</a>
|
|
<a href="https://riot.im/app/#/room/#plume:disroot.org">@i18n!(ctx.1, "Matrix room")</a>
|
|
</div>
|
|
</footer>
|
|
<script src="@uri!(plume_static_files: file = "plume-front.js", _build_id = CACHE_NAME)"></script>
|
|
</body>
|
|
</html>
|