frontend: Minor work to make it a little less terrible

This commit is contained in:
Lennart
2025-04-13 18:42:13 +02:00
parent 8976832e6b
commit a60d8deacc
8 changed files with 92 additions and 29 deletions

View File

@@ -1,7 +1,39 @@
body { body {
font-family: sans-serif; font-family: sans-serif;
margin: 0;
} }
* { * {
box-sizing: border-box; box-sizing: border-box;
} }
#app {
padding: 12px;
}
header {
background: #EEE;
height: 80px;
font-weight: bold;
display: flex;
align-items: center;
padding: 12px;
font-size: 2em;
a {
text-decoration: none;
color: black;
}
.logout_form {
margin-left: auto;
}
}
.login_window {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}

View File

@@ -10,7 +10,15 @@
</head> </head>
<body> <body>
<div id="app" hx-boost="true"> {% block header %}
<header>
<a href="/frontend/user">RustiCal</a>
<form method="POST" action="/frontend/logout" class="logout_form">
<button type="submit">Log out</button>
</form>
</header>
{% endblock %}
<div id="app">
{% block content %}<p>Placeholder</p>{% endblock %} {% block content %}<p>Placeholder</p>{% endblock %}
</div> </div>
</body> </body>

View File

@@ -10,5 +10,4 @@
<pre>{{ addressbook|json }}</pre> <pre>{{ addressbook|json }}</pre>
<a href="/frontend/user/{{ addressbook.principal }}">Back</a>
{% endblock %} {% endblock %}

View File

@@ -9,6 +9,4 @@
{% if let Some(description) = calendar.description %}<p>{{ description }}</p>{% endif%} {% if let Some(description) = calendar.description %}<p>{{ description }}</p>{% endif%}
<pre>{{ calendar|json }}</pre> <pre>{{ calendar|json }}</pre>
<a href="/frontend/user/{{ calendar.principal }}">Back</a>
{% endblock %} {% endblock %}

View File

@@ -1,17 +1,22 @@
{% extends "layouts/default.html" %} {% extends "layouts/default.html" %}
{% block content %} {% block content %}
<h1>Login</h1>
<form action="login" method="post">
<label for="username">Username</label>
<input type="text" name="username" placeholder="username">
<label for="password">Password</label>
<input type="password" name="password" placeholder="password">
<button type="submit">Login</button>
</form>
{% if let Some(OidcProviderData {name, redirect_url}) = oidc_data %} <div class="login_window">
<a href="{{ redirect_url }}">Login with {{ name }}</a> <h1>Login</h1>
{% endif %} <form action="login" method="post" id="form_login">
<label for="username">Username</label>
<input type="text" id="username" name="username" placeholder="username">
<br>
<label for="password">Password</label>
<input type="password" id="password" name="password" placeholder="password">
<br>
<button type="submit">Login</button>
</form>
{% endblock %} {% if let Some(OidcProviderData {name, redirect_url}) = oidc_data %}
<a href="{{ redirect_url }}">Login with {{ name }}</a>
{% endif %}
{% endblock %}
</div>

View File

@@ -54,12 +54,22 @@ li.collection-list-item {
} }
</style> </style>
<h1>Welcome {{ user.id }}!</h1> <h1>Welcome {{ user.id }}!</h1>
<form method="POST" action="/frontend/logout">
<button type="submit">Log out</button>
</form>
<h2>Profile</h2> <h2>Profile</h2>
<form>
<label for="user_displayname">Displayname</label>
<input type="text" value="{{ user.displayname.clone().unwrap_or(String::new()) }}" id="user_displayname" />
</form>
<h3>Groups</h3>
<ul>
{% for group in user.memberships %}
<li>{{ group }}</li>
{% endfor %}
</ul>
<h3>App tokens</h3> <h3>App tokens</h3>
<ul> <ul>

View File

@@ -7,7 +7,7 @@ use actix_web::{
dev::ServiceResponse, dev::ServiceResponse,
http::{Method, StatusCode}, http::{Method, StatusCode},
middleware::{ErrorHandlerResponse, ErrorHandlers}, middleware::{ErrorHandlerResponse, ErrorHandlers},
web::{self, Data, Path}, web::{self, Data, Path, Redirect},
}; };
use askama::Template; use askama::Template;
use askama_web::WebTemplate; use askama_web::WebTemplate;
@@ -41,7 +41,16 @@ struct UserPage {
pub deleted_addressbooks: Vec<Addressbook>, pub deleted_addressbooks: Vec<Addressbook>,
} }
async fn route_user<CS: CalendarStore, AS: AddressbookStore>( async fn route_user(user: User, req: HttpRequest) -> Redirect {
Redirect::to(
req.url_for("frontend_user_named", &[&user.id])
.unwrap()
.to_string(),
)
.see_other()
}
async fn route_user_named<CS: CalendarStore, AS: AddressbookStore>(
path: Path<String>, path: Path<String>,
cal_store: Data<CS>, cal_store: Data<CS>,
addr_store: Data<AS>, addr_store: Data<AS>,
@@ -79,17 +88,14 @@ async fn route_user<CS: CalendarStore, AS: AddressbookStore>(
deleted_calendars, deleted_calendars,
addressbooks, addressbooks,
deleted_addressbooks, deleted_addressbooks,
user: user, user,
} }
.respond_to(&req) .respond_to(&req)
} }
async fn route_root(user: Option<User>, req: HttpRequest) -> impl Responder { async fn route_root(user: Option<User>, req: HttpRequest) -> impl Responder {
let redirect_url = match user { let redirect_url = match user {
Some(user) => req Some(_) => req.url_for_static("frontend_user").unwrap(),
.resource_map()
.url_for(&req, "frontend_user", &[user.id])
.unwrap(),
None => req None => req
.resource_map() .resource_map()
.url_for::<[_; 0], String>(&req, "frontend_login", []) .url_for::<[_; 0], String>(&req, "frontend_login", [])
@@ -150,10 +156,15 @@ pub fn configure_frontend<AP: AuthenticationProvider, CS: CalendarStore, AS: Add
.service(EmbedService::<Assets>::new("/assets".to_owned())) .service(EmbedService::<Assets>::new("/assets".to_owned()))
.service(web::resource("").route(web::method(Method::GET).to(route_root))) .service(web::resource("").route(web::method(Method::GET).to(route_root)))
.service( .service(
web::resource("/user/{user}") web::resource("/user")
.route(web::method(Method::GET).to(route_user::<CS, AS>)) .route(web::method(Method::GET).to(route_user))
.name("frontend_user"), .name("frontend_user"),
) )
.service(
web::resource("/user/{user}")
.route(web::method(Method::GET).to(route_user_named::<CS, AS>))
.name("frontend_user_named"),
)
.service( .service(
web::resource("/user/{user}/calendar/{calendar}") web::resource("/user/{user}/calendar/{calendar}")
.route(web::method(Method::GET).to(route_calendar::<CS>)), .route(web::method(Method::GET).to(route_calendar::<CS>)),

View File

@@ -230,7 +230,7 @@ pub async fn route_get_oidc_callback<AP: AuthenticationProvider>(
session.insert("user", user.id.clone())?; session.insert("user", user.id.clone())?;
Ok( Ok(
Redirect::to(req.url_for("frontend_user", &[user.id])?.to_string()) Redirect::to(req.url_for_static("frontend_user")?.to_string())
.temporary() .temporary()
.respond_to(&req) .respond_to(&req)
.map_into_boxed_body(), .map_into_boxed_body(),