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, first: bool) -> askama::Result { 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 { if *show { Ok(String::from(text)) } else { Ok(String::new()) } } pub fn insert_value(option: &Option) -> askama::Result 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) -> askama::Result { 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(option: &Option, other: &T) -> askama::Result where T: Eq, { Ok(option.as_ref().is_some_and(|x| x == other)) } pub fn invert(b: &bool) -> askama::Result { Ok(!b) } pub fn show_tree(f: &UserFunction) -> askama::Result { 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 { 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 { 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 { 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('&', "&") .replace('<', "<") .replace('>', ">") .replace('"', """) .replace('\'', "'") }