settings/security: display page
This commit is contained in:
parent
11e2894621
commit
4d9305f3d2
6 changed files with 123 additions and 4 deletions
|
|
@ -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![
|
||||||
label: "Personal",
|
SubItem {
|
||||||
link: uri!(routes::settings::personal::user_settings_personal).to_string(),
|
label: "Personal",
|
||||||
}]),
|
link: uri!(routes::settings::personal::user_settings_personal).to_string(),
|
||||||
|
},
|
||||||
|
SubItem {
|
||||||
|
label: "Security",
|
||||||
|
link: uri!(routes::settings::security::user_settings_security).to_string(),
|
||||||
|
},
|
||||||
|
]),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
crates/ezidam/src/routes/settings/security.rs
Normal file
15
crates/ezidam/src/routes/settings/security.rs
Normal 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()))
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
81
crates/ezidam/templates/pages/settings/security.html.tera
Normal file
81
crates/ezidam/templates/pages/settings/security.html.tera
Normal 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 %}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue