settings/security: display page

This commit is contained in:
Philippe Loctaux 2023-04-07 17:48:50 +02:00
parent 11e2894621
commit 4d9305f3d2
6 changed files with 123 additions and 4 deletions

View file

@ -29,10 +29,16 @@ impl UserMenu {
label: "Settings", label: "Settings",
link: uri!(routes::settings::user_settings).to_string(), link: uri!(routes::settings::user_settings).to_string(),
icon: Icon::Settings.svg, icon: Icon::Settings.svg,
sub: Some(vec![SubItem { sub: Some(vec![
SubItem {
label: "Personal", label: "Personal",
link: uri!(routes::settings::personal::user_settings_personal).to_string(), link: uri!(routes::settings::personal::user_settings_personal).to_string(),
}]), },
SubItem {
label: "Security",
link: uri!(routes::settings::security::user_settings_security).to_string(),
},
]),
}, },
] ]
} }

View file

@ -22,6 +22,7 @@ pub enum Page {
AdminAppsNew(AdminAppsNew), AdminAppsNew(AdminAppsNew),
AdminAppsView(AdminAppsView), AdminAppsView(AdminAppsView),
UserPersonalSettings(UserPersonalSettings), UserPersonalSettings(UserPersonalSettings),
UserSecuritySettings(UserSecuritySettings),
} }
impl Page { impl Page {
@ -40,6 +41,7 @@ impl Page {
Page::AdminAppsNew(_) => "pages/admin/apps/new", Page::AdminAppsNew(_) => "pages/admin/apps/new",
Page::AdminAppsView(_) => "pages/admin/apps/view", Page::AdminAppsView(_) => "pages/admin/apps/view",
Page::UserPersonalSettings(_) => "pages/settings/personal", Page::UserPersonalSettings(_) => "pages/settings/personal",
Page::UserSecuritySettings(_) => "pages/settings/security",
} }
} }
@ -58,6 +60,7 @@ impl Page {
Page::AdminAppsNew(_) => "New application", Page::AdminAppsNew(_) => "New application",
Page::AdminAppsView(_) => "Application info", Page::AdminAppsView(_) => "Application info",
Page::UserPersonalSettings(_) => "Personal settings", Page::UserPersonalSettings(_) => "Personal settings",
Page::UserSecuritySettings(_) => "Security settings",
} }
} }
@ -78,6 +81,7 @@ impl Page {
Page::AdminAppsNew(_) => Some(AdminMenu::Apps.into()), Page::AdminAppsNew(_) => Some(AdminMenu::Apps.into()),
Page::AdminAppsView(_) => Some(AdminMenu::Apps.into()), Page::AdminAppsView(_) => Some(AdminMenu::Apps.into()),
Page::UserPersonalSettings(_) => Some(UserMenu::Settings.into()), Page::UserPersonalSettings(_) => Some(UserMenu::Settings.into()),
Page::UserSecuritySettings(_) => Some(UserMenu::Settings.into()),
} }
} }
@ -96,6 +100,7 @@ impl Page {
Page::AdminAppsNew(new) => Box::new(new), Page::AdminAppsNew(new) => Box::new(new),
Page::AdminAppsView(view) => Box::new(view), Page::AdminAppsView(view) => Box::new(view),
Page::UserPersonalSettings(personal) => Box::new(personal), Page::UserPersonalSettings(personal) => Box::new(personal),
Page::UserSecuritySettings(security) => Box::new(security),
} }
} }
} }

View file

@ -1,14 +1,17 @@
use super::prelude::*; use super::prelude::*;
use personal::*; use personal::*;
use rocket::get; use rocket::get;
use security::*;
pub mod personal; pub mod personal;
pub mod security;
pub fn routes() -> Vec<Route> { pub fn routes() -> Vec<Route> {
routes![ routes![
user_settings, user_settings,
user_settings_personal, user_settings_personal,
user_settings_personal_form, user_settings_personal_form,
user_settings_security,
] ]
} }
@ -30,4 +33,11 @@ pub mod content {
pub name: Option<String>, pub name: Option<String>,
pub email: Option<String>, pub email: Option<String>,
} }
#[derive(Serialize)]
#[serde(crate = "rocket::serde")]
#[derive(Clone)]
pub struct UserSecuritySettings {
pub user: JwtClaims,
}
} }

View file

@ -0,0 +1,15 @@
use crate::routes::prelude::*;
use rocket::get;
#[get("/settings/security")]
pub async fn user_settings_security(
jwt_user: JwtUser,
flash: Option<FlashMessage<'_>>,
) -> Result<Template> {
let page =
Page::UserSecuritySettings(super::content::UserSecuritySettings { user: jwt_user.0 });
Ok(flash
.map(|flash| Page::with_flash(page.clone(), flash))
.unwrap_or_else(|| page.into()))
}

View file

@ -30,6 +30,8 @@
<div class="list-group list-group-transparent"> <div class="list-group list-group-transparent">
<a href="./personal" <a href="./personal"
class="list-group-item list-group-item-action d-flex align-items-center active">Personal</a> class="list-group-item list-group-item-action d-flex align-items-center active">Personal</a>
<a href="./security"
class="list-group-item list-group-item-action d-flex align-items-center">Security</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -0,0 +1,81 @@
{% extends "shell" %}
{% block content %}
<!-- Page header -->
<div class="page-header d-print-none">
<div class="container-xl">
<div class="row g-2 align-items-center">
<div class="col">
<h2 class="page-title">
Settings
</h2>
</div>
</div>
</div>
</div>
<!-- Page body -->
<div class="page-body">
<div class="container-xl">
{% if flash %}
<div class="alert alert-{{flash.0}}" role="alert">
<h4 class="alert-title">{{ flash.1 | safe }}</h4>
</div>
{% endif %}
<div class="card">
<div class="row g-0">
<div class="col-3 d-none d-md-block border-end">
<div class="card-body">
<div class="list-group list-group-transparent">
<a href="./personal"
class="list-group-item list-group-item-action d-flex align-items-center">Personal</a>
<a href="./security"
class="list-group-item list-group-item-action d-flex align-items-center active">Security</a>
</div>
</div>
</div>
<div class="col d-flex flex-column">
<div class="card-body">
<h2 class="mb-4">Security</h2>
<!-- Password -->
<div class="mb-4">
<h3 class="card-title">Password</h3>
<div>
<a href="#" class="btn">
Set new password
</a>
</div>
</div>
<!-- Paper key -->
<div class="mb-4">
<h3 class="card-title">Paper key</h3>
<p class="card-subtitle">
You can use your paper key to reset your password if you forget it.</p>
<div>
<a href="#" class="btn">
Generate new paper key
</a>
</div>
</div>
<!-- Logout everywhere -->
<div class="mb-4">
<h3 class="card-title">Logout everywhere</h3>
<p class="card-subtitle">Logout from every application you signed in with your account.</p>
<div>
<a href="#" class="btn btn-danger">
Logout everywhere
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}