refactor
This commit is contained in:
5
rust/src/routing/html.rs
Normal file
5
rust/src/routing/html.rs
Normal file
@@ -0,0 +1,5 @@
|
||||
use maud::{html, Markup};
|
||||
|
||||
pub fn concat(a: Markup, b: Markup) -> Markup {
|
||||
html!((a)(b))
|
||||
}
|
||||
@@ -1,48 +1,18 @@
|
||||
use axum::{
|
||||
http::header::{HeaderMap, HeaderName},
|
||||
http::header::HeaderMap,
|
||||
middleware,
|
||||
routing::{get, post},
|
||||
Router,
|
||||
};
|
||||
|
||||
use crate::{authorize, AppState, Error, RequestError, TopLevelPage};
|
||||
use crate::{AppState, Error, RequestError, TopLevelPage};
|
||||
|
||||
use super::auth;
|
||||
|
||||
mod html;
|
||||
mod routes;
|
||||
use routes::*;
|
||||
|
||||
enum HtmxResponseHeaders {
|
||||
Trigger,
|
||||
PushUrl,
|
||||
}
|
||||
|
||||
impl From<HtmxResponseHeaders> for HeaderName {
|
||||
fn from(val: HtmxResponseHeaders) -> Self {
|
||||
match val {
|
||||
HtmxResponseHeaders::Trigger => HeaderName::from_static("hx-trigger"),
|
||||
HtmxResponseHeaders::PushUrl => HeaderName::from_static("hx-push-url"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum HtmxRequestHeaders {
|
||||
HtmxRequest,
|
||||
}
|
||||
|
||||
impl From<HtmxRequestHeaders> for HeaderName {
|
||||
fn from(val: HtmxRequestHeaders) -> Self {
|
||||
match val {
|
||||
HtmxRequestHeaders::HtmxRequest => HeaderName::from_static("hx-request"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_htmx(headers: &HeaderMap) -> bool {
|
||||
headers
|
||||
.get::<HeaderName>(HtmxRequestHeaders::HtmxRequest.into())
|
||||
.map(|value| value == "true")
|
||||
.unwrap_or(false)
|
||||
}
|
||||
|
||||
fn get_referer<'a>(headers: &'a HeaderMap) -> Result<&'a str, Error> {
|
||||
headers
|
||||
.get("referer")
|
||||
@@ -142,7 +112,10 @@ pub fn router(state: AppState) -> Router {
|
||||
.route("/item/:id/edit", post(inventory_item_edit))
|
||||
.route("/item/name/validate", post(inventory_item_validate_name)),
|
||||
)
|
||||
.layer(middleware::from_fn_with_state(state.clone(), authorize)),
|
||||
.layer(middleware::from_fn_with_state(
|
||||
state.clone(),
|
||||
auth::authorize,
|
||||
)),
|
||||
)
|
||||
.fallback(|| async {
|
||||
Error::Request(RequestError::NotFound {
|
||||
|
||||
@@ -8,11 +8,12 @@ use axum::{
|
||||
use serde::Deserialize;
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::htmx;
|
||||
use crate::models;
|
||||
use crate::view;
|
||||
use crate::{html, AppState, Context, Error, HtmxEvents, RequestError, TopLevelPage};
|
||||
use crate::{AppState, Context, Error, RequestError, TopLevelPage};
|
||||
|
||||
use super::{get_referer, is_htmx, HtmxResponseHeaders};
|
||||
use super::{get_referer, html};
|
||||
|
||||
#[derive(Deserialize, Default)]
|
||||
pub struct InventoryQuery {
|
||||
@@ -210,7 +211,7 @@ pub async fn inventory_item_create(
|
||||
)
|
||||
.await?;
|
||||
|
||||
if is_htmx(&headers) {
|
||||
if htmx::is_htmx(&headers) {
|
||||
let inventory = models::inventory::Inventory::load(&state.database_pool).await?;
|
||||
|
||||
// it's impossible to NOT find the item here, as we literally just added
|
||||
@@ -521,8 +522,8 @@ pub async fn trip_item_set_pick_htmx(
|
||||
.await?;
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::Trigger.into(),
|
||||
HtmxEvents::TripItemEdited.into(),
|
||||
htmx::ResponseHeaders::Trigger.into(),
|
||||
htmx::Event::TripItemEdited.into(),
|
||||
);
|
||||
Ok((headers, trip_row(&state, trip_id, item_id).await?))
|
||||
}
|
||||
@@ -559,8 +560,8 @@ pub async fn trip_item_set_unpick_htmx(
|
||||
.await?;
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::Trigger.into(),
|
||||
HtmxEvents::TripItemEdited.into(),
|
||||
htmx::ResponseHeaders::Trigger.into(),
|
||||
htmx::Event::TripItemEdited.into(),
|
||||
);
|
||||
Ok((headers, trip_row(&state, trip_id, item_id).await?))
|
||||
}
|
||||
@@ -597,8 +598,8 @@ pub async fn trip_item_set_pack_htmx(
|
||||
.await?;
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::Trigger.into(),
|
||||
HtmxEvents::TripItemEdited.into(),
|
||||
htmx::ResponseHeaders::Trigger.into(),
|
||||
htmx::Event::TripItemEdited.into(),
|
||||
);
|
||||
Ok((headers, trip_row(&state, trip_id, item_id).await?))
|
||||
}
|
||||
@@ -635,8 +636,8 @@ pub async fn trip_item_set_unpack_htmx(
|
||||
.await?;
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::Trigger.into(),
|
||||
HtmxEvents::TripItemEdited.into(),
|
||||
htmx::ResponseHeaders::Trigger.into(),
|
||||
htmx::Event::TripItemEdited.into(),
|
||||
);
|
||||
Ok((headers, trip_row(&state, trip_id, item_id).await?))
|
||||
}
|
||||
@@ -673,8 +674,8 @@ pub async fn trip_item_set_ready_htmx(
|
||||
.await?;
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::Trigger.into(),
|
||||
HtmxEvents::TripItemEdited.into(),
|
||||
htmx::ResponseHeaders::Trigger.into(),
|
||||
htmx::Event::TripItemEdited.into(),
|
||||
);
|
||||
Ok((headers, trip_row(&state, trip_id, item_id).await?))
|
||||
}
|
||||
@@ -711,8 +712,8 @@ pub async fn trip_item_set_unready_htmx(
|
||||
.await?;
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::Trigger.into(),
|
||||
HtmxEvents::TripItemEdited.into(),
|
||||
htmx::ResponseHeaders::Trigger.into(),
|
||||
htmx::Event::TripItemEdited.into(),
|
||||
);
|
||||
Ok((headers, trip_row(&state, trip_id, item_id).await?))
|
||||
}
|
||||
@@ -758,7 +759,7 @@ pub async fn trip_state_set(
|
||||
}));
|
||||
}
|
||||
|
||||
if is_htmx(&headers) {
|
||||
if htmx::is_htmx(&headers) {
|
||||
Ok(view::trip::TripInfoStateRow::build(&new_state).into_response())
|
||||
} else {
|
||||
Ok(Redirect::to(&format!("/trips/{id}/", id = trip_id)).into_response())
|
||||
@@ -861,7 +862,7 @@ pub async fn trip_category_select(
|
||||
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::PushUrl.into(),
|
||||
htmx::ResponseHeaders::PushUrl.into(),
|
||||
format!("?={category_id}").parse().unwrap(),
|
||||
);
|
||||
|
||||
@@ -889,7 +890,7 @@ pub async fn inventory_category_select(
|
||||
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert::<HeaderName>(
|
||||
HtmxResponseHeaders::PushUrl.into(),
|
||||
htmx::ResponseHeaders::PushUrl.into(),
|
||||
format!("/inventory/category/{category_id}/")
|
||||
.parse()
|
||||
.unwrap(),
|
||||
|
||||
Reference in New Issue
Block a user