mod htmx;
mod modal_form;
mod query;
mod result_log;
pub use htmx::{
FK_CREATED_EVENT, Htmx, HtmxRequestType, TABLE_REFRESH_EVENT, htmx_middleware,
parse_element_id, respond_create_modal_done, respond_create_modal_done_fk,
respond_create_modal_done_fk_extra, respond_edit_modal_done, table_refresh_event,
};
pub use modal_form::{
CreateModal, ModalFormQuery, modal_create_get_for, modal_create_get_for_picker,
modal_create_get_url, modal_create_href_for_picker, modal_create_href_for_table,
modal_create_post_for, modal_create_post_query, modal_create_post_url,
modal_create_post_url_for_table, modal_edit_post_url,
};
pub use query::{
ApplyQuery, QueryI64, QueryPage, QueryPageSize, QueryStr, patch_query_url, query_bool,
query_i64, query_str, query_u32,
};
pub use result_log::{log_err, log_warn, opt_or_log};
use axum::http::{HeaderValue, header};
use frunk::Generic;
use maud::Markup;
use crate::components::{ShellChrome, SlotCapability, SlotCtx};
use crate::template::RenderTemplate;
pub fn html_page<P: Generic + RenderTemplate>(fields: P::Repr, chrome: &ShellChrome) -> Markup {
html_template(P::from(fields), chrome)
}
pub fn html_template<T: RenderTemplate>(template: T, chrome: &ShellChrome) -> Markup {
template.render(chrome)
}
pub fn html_page_with_slots<P, Slots>(
fields: P::Repr,
folder: &SlotCapability<Slots>,
ctx: &SlotCtx,
) -> Markup
where
P: Generic + RenderTemplate,
Slots: crate::components::FoldSlots,
{
let chrome = folder.fold(ctx);
html_page::<P>(fields, &chrome)
}
pub fn html_page_or_app_layout<P, Slots>(
htmx: &Htmx,
fields: P::Repr,
folder: &SlotCapability<Slots>,
ctx: &SlotCtx,
) -> Markup
where
P: Generic + RenderTemplate + crate::template::RenderAppPane,
Slots: crate::components::FoldSlots,
{
let page = P::from(fields);
if htmx.wants_main_content() {
return page.render_main().into();
}
if htmx.wants_app_layout() {
return page.render_pane().into();
}
let chrome = folder.fold(ctx);
page.render(&chrome)
}
pub use crate::layers::{
html_built_page_or_app_layout, html_built_page_with_slots, render_from_data,
};
pub fn set_cookie_header(name: &str, value: &str, max_age_secs: i64, secure: bool) -> HeaderValue {
let secure_flag = if secure { "; Secure" } else { "" };
let raw = format!(
"{name}={value}; Path=/; HttpOnly; SameSite=Lax; Max-Age={max_age_secs}{secure_flag}"
);
HeaderValue::from_str(&raw).expect("cookie header")
}
pub fn clear_cookie_header(name: &str, secure: bool) -> HeaderValue {
let secure_flag = if secure { "; Secure" } else { "" };
let raw = format!("{name}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0{secure_flag}");
HeaderValue::from_str(&raw).expect("cookie header")
}
pub use header::SET_COOKIE;