brass/web/src/filters.rs

129 lines
3.2 KiB
Rust

use std::fmt::Display;
use chrono::{
format::{DelayedFormat, StrftimeItems},
NaiveDate, NaiveDateTime, NaiveTime,
};
use maud::html;
use tracing::trace;
use crate::utils::DateTimeFormat;
use brass_db::models::UserFunction;
pub fn show_area_query(a: &Option<i32>, first: bool) -> askama::Result<String> {
let char = if first { '?' } else { '&' };
if let Some(a) = a {
Ok(format!("{}area={}", char, a))
} else {
Ok(String::new())
}
}
pub fn cond_show(show: &bool, text: &str) -> askama::Result<String> {
if *show {
Ok(String::from(text))
} else {
Ok(String::new())
}
}
pub fn insert_value<T>(option: &Option<T>) -> askama::Result<String>
where
T: Display,
{
if let Some(val) = option {
let escaped = escape_html(val.to_string());
let s = format!(r#"value="{escaped}""#);
return Ok(s);
}
Ok(String::new())
}
pub fn insert_time_value(option: &Option<NaiveTime>) -> askama::Result<String> {
if let Some(val) = option {
let s = val.format(r#"value="%H:%M""#).to_string();
return Ok(s);
}
Ok(String::new())
}
pub fn is_some_and_eq<T>(option: &Option<T>, other: &T) -> askama::Result<bool>
where
T: Eq,
{
Ok(option.as_ref().is_some_and(|x| x == other))
}
pub fn invert(b: &bool) -> askama::Result<bool> {
Ok(!b)
}
pub fn show_tree(f: &UserFunction) -> askama::Result<String> {
let html = html! {
div class="tags" {
@if f.is_posten() {
span class="tag is-primary is-light" { "Posten"}
}
@if f.is_wachhabender() {
span class="tag is-primary has-background-primary-85 has-text-primary-85-invert" { "Wachhabender"}
}
@if f.is_fuehrungsassistent() {
span class="tag is-primary" { "Führungsassistent"}
}
}
};
Ok(html.into_string())
}
pub fn fmt_date(v: &NaiveDate, format: DateTimeFormat) -> askama::Result<String> {
let format_string = format.into();
trace!(
format = format_string,
"formatting naivedate into string with format"
);
Ok(v.format_localized(format_string, chrono::Locale::de_DE)
.to_string())
}
pub fn fmt_datetime(v: &NaiveDateTime, format: DateTimeFormat) -> askama::Result<String> {
let format_string = format.into();
trace!(
format = format_string,
"formatting naivedatetime into string with format"
);
let locale = chrono::Locale::de_DE;
let out = DelayedFormat::new_with_locale(
Some(v.date()),
Some(v.time()),
StrftimeItems::new_with_locale(format_string, locale),
locale,
);
Ok(out.to_string())
}
pub fn fmt_time(v: &NaiveTime, format: DateTimeFormat) -> askama::Result<String> {
let format_string = format.into();
trace!(
format = format_string,
"formatting naivetime into string with format"
);
Ok(v.format(format_string).to_string())
}
fn escape_html(string: String) -> String {
string
.replace('&', "&amp;")
.replace('<', "&lt;")
.replace('>', "&gt;")
.replace('"', "&quot;")
.replace('\'', "&#x27;")
}