Server: Add Submission/User tabs to browse page

- Remove account dark state
This commit is contained in:
asonix 2021-01-30 14:33:07 -06:00
parent 0bacafd8a8
commit ddac4d3b9c
17 changed files with 122 additions and 116 deletions

View file

@ -85,11 +85,16 @@ picture {
}
.home-content {
padding: 96px 0 32px;
padding: 80px 0 32px;
}
.tabs {
padding: 0 12px;
overflow-x: auto;
}
.profile-search {
margin-bottom: 32px;
margin: 32px 0;
}
.profile-result {
@ -307,6 +312,10 @@ picture {
right: 0;
}
.tabs {
padding: 0;
}
.profile-search {
padding: 0 8px;
}

View file

@ -101,13 +101,11 @@ async fn cookies_page(
args: CookiesPageArgs,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut cookie_state = match hyaenidae_accounts::cookies_page(args) {
let cookie_state = match hyaenidae_accounts::cookies_page(args) {
Ok(state) => state,
Err(res) => return Ok(res),
};
cookie_state.dark(nav_state.dark());
rendered(HttpResponse::Ok(), |cursor| {
crate::templates::session::cookies(cursor, &loader, &cookie_state, &nav_state)
})
@ -122,13 +120,11 @@ async fn login_page(
args: LoginPageArgs,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut login_state = match hyaenidae_accounts::login_page(args) {
let login_state = match hyaenidae_accounts::login_page(args) {
Ok(state) => state,
Err(res) => return Ok(res),
};
login_state.dark(nav_state.dark());
rendered(HttpResponse::Ok(), |cursor| {
crate::templates::session::login(cursor, &loader, &login_state, &nav_state)
})
@ -139,13 +135,11 @@ async fn login(
args: LoginArgs,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut login_state = match hyaenidae_accounts::login(args).await? {
let login_state = match hyaenidae_accounts::login(args).await? {
Ok(state) => state,
Err(res) => return Ok(res),
};
login_state.dark(nav_state.dark());
rendered(HttpResponse::BadRequest(), |cursor| {
crate::templates::session::login(cursor, &loader, &login_state, &nav_state)
})
@ -156,13 +150,11 @@ async fn register_page(
args: RegisterPageArgs,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut register_state = match hyaenidae_accounts::register_page(args) {
let register_state = match hyaenidae_accounts::register_page(args) {
Ok(state) => state,
Err(res) => return Ok(res),
};
register_state.dark(nav_state.dark());
rendered(HttpResponse::Ok(), |cursor| {
crate::templates::session::register(cursor, &loader, &register_state, &nav_state)
})
@ -173,13 +165,11 @@ async fn register(
args: RegisterArgs,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut register_state = match hyaenidae_accounts::register(args).await? {
let register_state = match hyaenidae_accounts::register(args).await? {
Ok(state) => state,
Err(res) => return Ok(res),
};
register_state.dark(nav_state.dark());
rendered(HttpResponse::BadRequest(), |cursor| {
crate::templates::session::register(cursor, &loader, &register_state, &nav_state)
})
@ -196,11 +186,8 @@ async fn account_page(
user: User,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut uname_state = hyaenidae_accounts::update_username_page(uname_args);
let mut pass_state = hyaenidae_accounts::update_password_page(pass_args);
uname_state.dark(nav_state.dark());
pass_state.dark(nav_state.dark());
let uname_state = hyaenidae_accounts::update_username_page(uname_args);
let pass_state = hyaenidae_accounts::update_password_page(pass_args);
rendered(HttpResponse::Ok(), |cursor| {
crate::templates::session::account(
@ -227,14 +214,11 @@ async fn update_username(
user: User,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut uname_state = match hyaenidae_accounts::update_username(uname_args).await? {
let uname_state = match hyaenidae_accounts::update_username(uname_args).await? {
Ok(state) => state,
Err(res) => return Ok(res),
};
let mut pass_state = hyaenidae_accounts::update_password_page(pass_args);
uname_state.dark(nav_state.dark());
pass_state.dark(nav_state.dark());
let pass_state = hyaenidae_accounts::update_password_page(pass_args);
rendered(HttpResponse::BadRequest(), |cursor| {
crate::templates::session::account(
@ -255,15 +239,12 @@ async fn update_password(
user: User,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut uname_state = hyaenidae_accounts::update_username_page(uname_args);
let mut pass_state = match hyaenidae_accounts::update_password(pass_args).await? {
let uname_state = hyaenidae_accounts::update_username_page(uname_args);
let pass_state = match hyaenidae_accounts::update_password(pass_args).await? {
Ok(state) => state,
Err(res) => return Ok(res),
};
uname_state.dark(nav_state.dark());
pass_state.dark(nav_state.dark());
rendered(HttpResponse::BadRequest(), |cursor| {
crate::templates::session::account(
cursor,
@ -281,13 +262,11 @@ async fn delete_account_page(
args: DeleteUserPageArgs,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut delete_state = match hyaenidae_accounts::delete_user_page(args) {
let delete_state = match hyaenidae_accounts::delete_user_page(args) {
Ok(state) => state,
Err(res) => return Ok(res),
};
delete_state.dark(nav_state.dark());
rendered(HttpResponse::Ok(), |cursor| {
crate::templates::session::delete_account(cursor, &loader, &delete_state, &nav_state)
})
@ -298,13 +277,11 @@ async fn delete_account(
args: DeleteUserArgs,
nav_state: NavState,
) -> Result<HttpResponse, Error> {
let mut delete_state = match hyaenidae_accounts::delete_user(args).await? {
let delete_state = match hyaenidae_accounts::delete_user(args).await? {
Ok(state) => state,
Err(res) => return Ok(res),
};
delete_state.dark(nav_state.dark());
rendered(HttpResponse::BadRequest(), |cursor| {
crate::templates::session::delete_account(cursor, &loader, &delete_state, &nav_state)
})

View file

@ -73,10 +73,6 @@ async fn main() -> anyhow::Result<()> {
};
let accounts_config = hyaenidae_accounts::Config {
toolkit_path: format!(
"/toolkit/{}",
hyaenidae_toolkit::templates::statics::toolkit_css.name
),
key: secret_key,
https: false,
pages: std::sync::Arc::new(accounts::Pages),

View file

@ -73,7 +73,7 @@ impl FromRequest for NavState {
admin,
href,
is_open,
dark: true,
dark: false,
})
})
}
@ -137,7 +137,7 @@ impl NavState {
}
fn logout_button(&self, logout_state: &LogoutState, loader: &ActixLoader) -> Button {
logout_state.button(Button::primary_outline(&fl!(loader, "nav-logout-button")))
Button::primary_outline(&fl!(loader, "nav-logout-button")).form(&logout_state.logout_path())
}
pub(crate) fn buttons(&self, loader: &ActixLoader) -> Vec<Button> {

View file

@ -4,13 +4,13 @@
@use hyaenidae_toolkit::{templates::{button_group, card, card_body, card_title}, Button, Card};
@use i18n_embed_fl::fl;
@(card_config: &Card, loader: &ActixLoader, state: &DeleteUserState)
@(card_config: &Card, loader: &ActixLoader, state: &DeleteUserState, dark: bool)
@:card(card_config, {
<form method="POST" action="@state.delete_user_path()">
@:card_title({ @fl!(loader, "delete-account-heading") })
@:card_body({
@:password_input("password", &fl!(loader, "password-input"), state.password(), state.password_error(), state.dark)
@:password_input("password", &fl!(loader, "password-input"), state.password(), state.password_error(), dark)
})
@:card_body({
@:button_group(&[

View file

@ -4,14 +4,14 @@
@use hyaenidae_toolkit::{templates::{button_group, card, card_body, card_title, link}, Button, Card, Link};
@use i18n_embed_fl::fl;
@(card_config: &Card, loader: &ActixLoader, state: &LoginState)
@(card_config: &Card, loader: &ActixLoader, state: &LoginState, dark: bool)
@:card(card_config, {
<form method="POST" action="@state.login_path()">
@:card_title({ @fl!(loader, "login-heading") })
@:card_body({
@:text_input("username", &fl!(loader, "login-username"), state.username(), state.username_error(), state.dark)
@:password_input("password", &fl!(loader, "login-password"), state.password(), None, state.dark)
@:text_input("username", &fl!(loader, "login-username"), state.username(), state.username_error(), dark)
@:password_input("password", &fl!(loader, "login-password"), state.password(), None, dark)
@:link(&Link::current_tab(&state.register_path()), { I do not have an account })
})
@:card_body({

View file

@ -1,6 +0,0 @@
@use hyaenidae_accounts::LogoutState;
@use hyaenidae_toolkit::{templates::button_group, Button};
@(btn: Button, state: &LogoutState)
@:button_group(&[state.button(btn)])

View file

@ -4,15 +4,15 @@
@use hyaenidae_toolkit::{templates::{button_group, card, card_body, card_title, link}, Button, Card, Link};
@use i18n_embed_fl::fl;
@(card_config: &Card, loader: &ActixLoader, state: &RegisterState)
@(card_config: &Card, loader: &ActixLoader, state: &RegisterState, dark: bool)
@:card(card_config, {
<form method="POST" action="@state.register_path()">
@:card_title({ @fl!(loader, "register-heading") })
@:card_body({
@:text_input("username", &fl!(loader, "register-username"), state.username(), state.username_error(), state.dark)
@:password_input("password", &fl!(loader, "register-password"), state.password(), None, state.dark)
@:password_input("password_confirmation", &fl!(loader, "register-confirmation"), state.confirmation(), state.confirmation_error(), state.dark)
@:text_input("username", &fl!(loader, "register-username"), state.username(), state.username_error(), dark)
@:password_input("password", &fl!(loader, "register-password"), state.password(), None, dark)
@:password_input("password_confirmation", &fl!(loader, "register-confirmation"), state.confirmation(), state.confirmation_error(), dark)
@:link(&Link::current_tab(&state.login_path()), { I already have an account })
})
@:card_body({

View file

@ -4,15 +4,15 @@
@use hyaenidae_toolkit::{templates::{button_group, card, card_body, card_title}, Button, Card};
@use i18n_embed_fl::fl;
@(card_config: &Card, loader: &ActixLoader, state: &UpdatePasswordState)
@(card_config: &Card, loader: &ActixLoader, state: &UpdatePasswordState, dark: bool)
@:card(card_config, {
<form method="POST" action="@state.update_password_path()">
@:card_title({ @fl!(loader, "update-password-heading") })
@:card_body({
@:password_input("new_password", &fl!(loader, "update-password-input"), state.new_password(), None, state.dark)
@:password_input("new_password_confirmation", &fl!(loader, "confirm-password-input"), state.new_password_confirmation(), state.new_password_confirmation_error(), state.dark)
@:password_input("password", &fl!(loader, "password-input"), state.password(), state.password_error(), state.dark)
@:password_input("new_password", &fl!(loader, "update-password-input"), state.new_password(), None, dark)
@:password_input("new_password_confirmation", &fl!(loader, "confirm-password-input"), state.new_password_confirmation(), state.new_password_confirmation_error(), dark)
@:password_input("password", &fl!(loader, "password-input"), state.password(), state.password_error(), dark)
})
@:card_body({
@:button_group(&[

View file

@ -4,14 +4,14 @@
@use hyaenidae_toolkit::{templates::{button_group, card, card_body, card_title}, Button, Card};
@use i18n_embed_fl::fl;
@(card_config: &Card, loader: &ActixLoader, state: &UpdateUsernameState)
@(card_config: &Card, loader: &ActixLoader, state: &UpdateUsernameState, dark: bool)
@:card(card_config, {
<form method="POST" action="@state.update_username_path()">
@:card_title({ @fl!(loader, "update-username-heading") })
@:card_body({
@:text_input("new_username", &fl!(loader, "update-username-input"), state.username(), state.username_error(), state.dark)
@:password_input("password", &fl!(loader, "password-input"), state.password(), state.password_error(), state.dark)
@:text_input("new_username", &fl!(loader, "update-username-input"), state.username(), state.username_error(), dark)
@:password_input("password", &fl!(loader, "password-input"), state.password(), state.password_error(), dark)
})
@:card_body({
@:button_group(&[

View file

@ -5,12 +5,23 @@
@use hyaenidae_toolkit::templates::button_group;
@use hyaenidae_toolkit::templates::centered;
@use hyaenidae_toolkit::{templates::{card, card_body, card_title}, Card};
@use hyaenidae_toolkit::{templates::{tab, tab_group}, Tab};
@use hyaenidae_toolkit::templates::{thumbnail, thumbnail_border, thumbnails};
@use i18n_embed_fl::fl;
@(loader: &ActixLoader, browse_view: &ViewBrowseState, nav_state: &NavState)
@:wide(loader, &fl!(loader, "site-name"), &fl!(loader, "site-description"), nav_state, {}, {
<div class="tabs">
@:tab_group({
@:tab(Tab::new("/browse").selected(true), {
@fl!(loader, "submissions-tab")
})
@:tab(Tab::new("/discover"), {
@fl!(loader, "profiles-tab")
})
})
</div>
@if browse_view.has_submissions() {
@if browse_view.has_nav() {
@:thumbnail_border({

View file

@ -2,63 +2,77 @@
@use crate::extensions::ProfileExt;
@use crate::nav::NavState;
@use crate::profile_list::ProfileListState;
@use crate::templates::layouts::home;
@use crate::templates::layouts::wide;
@use hyaenidae_toolkit::{templates::button_group, Button};
@use hyaenidae_toolkit::{templates::{card, card_body, card_section}, Card};
@use hyaenidae_toolkit::templates::centered;
@use hyaenidae_toolkit::templates::{icon, image};
@use hyaenidae_toolkit::{templates::link, Link};
@use hyaenidae_toolkit::templates::search;
@use hyaenidae_toolkit::{templates::{tab, tab_group}, Tab};
@use i18n_embed_fl::fl;
@(loader: &ActixLoader, state: &ProfileListState, nav_state: &NavState)
@:home(loader, &fl!(loader, "discover-users-title"), &fl!(loader, "discover-users-subtitle"), nav_state, {}, {
<div class="profile-search">
<form method="GET" action="@state.search_path()">
@:search(state.search_input(loader).dark(nav_state.dark()), Button::primary(&fl!(loader, "discover-users-search-button")))
</form>
@:wide(loader, &fl!(loader, "discover-users-title"), &fl!(loader, "discover-users-subtitle"), nav_state, {}, {
<div class="tabs">
@:tab_group({
@:tab(Tab::new("/browse"), {
@fl!(loader, "submissions-tab")
})
@:tab(Tab::new("/discover").selected(true), {
@fl!(loader, "profiles-tab")
})
})
</div>
@:card(&Card::full_width().dark(nav_state.dark()), {
@for pview in state.profiles() {
@:card_section({
<div class="profile-result">
@if let Some(img) = pview.banner_image(loader) {
<div class="profile-result--background">
@:image(&img)
</div>
}
<div class="profile-result--left">
<div class="profile-result--icon">
@:icon(&pview.icon(loader).small(true).dark(nav_state.dark()))
</div>
<div class="profile-result--meta">
<div class="profile-result--display-name">
@if let Some(display_name) = pview.profile.display_name() {
@:link(&Link::current_tab(&pview.profile.view_path()).plain(true), {
@Html(display_name)
})
}
@:centered(false, {
<div class="profile-search">
<form method="GET" action="@state.search_path()">
@:search(state.search_input(loader).dark(nav_state.dark()), Button::primary(&fl!(loader, "discover-users-search-button")))
</form>
</div>
@:card(&Card::full_width().dark(nav_state.dark()), {
@for pview in state.profiles() {
@:card_section({
<div class="profile-result">
@if let Some(img) = pview.banner_image(loader) {
<div class="profile-result--background">
@:image(&img)
</div>
<div class="profile-result--handle">
@:link(&Link::current_tab(&pview.profile.view_path()).plain(true), {
@pview.profile.full_handle()
})
</div>
</div>
</div>
<div class="profile-result--buttons">
@if !pview.profile.is_suspended() {
@:button_group(&state.profile_buttons(loader, pview))
}
<div class="profile-result--left">
<div class="profile-result--icon">
@:icon(&pview.icon(loader).small(true).dark(nav_state.dark()))
</div>
<div class="profile-result--meta">
<div class="profile-result--display-name">
@if let Some(display_name) = pview.profile.display_name() {
@:link(&Link::current_tab(&pview.profile.view_path()).plain(true), {
@Html(display_name)
})
}
</div>
<div class="profile-result--handle">
@:link(&Link::current_tab(&pview.profile.view_path()).plain(true), {
@pview.profile.full_handle()
})
</div>
</div>
</div>
<div class="profile-result--buttons">
@if !pview.profile.is_suspended() {
@:button_group(&state.profile_buttons(loader, pview))
}
</div>
</div>
</div>
})
}
})
}
@if state.has_nav() {
@:card_body({
@:button_group(&state.nav(loader))
})
}
@if state.has_nav() {
@:card_body({
@:button_group(&state.nav(loader))
})
}
})
})
})

View file

@ -12,10 +12,12 @@
@:button_js()
}, {
@:card(&Card::full_width().dark(nav_state.dark()), {
@:card_title({ @fl!(loader, "username-heading", currentUsername = user.username()) })
@:card_title({
@fl!(loader, "username-heading", currentUsername = user.username())
})
})
@:update_username(&Card::full_width().dark(nav_state.dark()), loader, uname_state)
@:update_password(&Card::full_width().dark(nav_state.dark()), loader, pass_state)
@:update_username(&Card::full_width().dark(nav_state.dark()), loader, uname_state, nav_state.dark())
@:update_password(&Card::full_width().dark(nav_state.dark()), loader, pass_state, nav_state.dark())
@:card(&Card::full_width().dark(nav_state.dark()), {
@:card_title({ @fl!(loader, "danger-heading") })
@:card_body({

View file

@ -11,5 +11,5 @@
@:home(loader, &fl!(loader, "delete-account-heading"), &fl!(loader, "delete-account-confirmation"), nav_state, {
@:button_js()
}, {
@:delete_user(&Card::full_width().dark(nav_state.dark()), loader, state)
@:delete_user(&Card::full_width().dark(nav_state.dark()), loader, state, nav_state.dark())
})

View file

@ -11,5 +11,5 @@
@:home(loader, &fl!(loader, "login-heading"), &fl!(loader, "login-subheading"), nav_state, {
@:button_js()
}, {
@:login(&Card::full_width().dark(nav_state.dark()), loader, login_state)
@:login(&Card::full_width().dark(nav_state.dark()), loader, login_state, nav_state.dark())
})

View file

@ -9,5 +9,5 @@
@(loader: &ActixLoader, register_state: &RegisterState, nav_state: &NavState)
@:home(loader, &fl!(loader, "register-heading"), &fl!(loader, "register-subheading"), nav_state, { @:button_js() }, {
@:register(&Card::full_width().dark(nav_state.dark()), loader, register_state)
@:register(&Card::full_width().dark(nav_state.dark()), loader, register_state, nav_state.dark())
})

View file

@ -361,6 +361,9 @@ feed-empty-subtitle = Follow users on Hyaenidae to start seeing submissions in y
feed-empty-browse-users = Browse Users
feed-empty-browse-submissions = Browse Submissions
submissions-tab = Submissions
profiles-tab = Users
notification-count = Notifications: {$count}
notification-subtitle = Notifications on {site-name}
notification-clear-all-heading = Clear All