mod.rs
84 lignes · 2663 octets
//! Settings handlers — split by domain: profile, security, preferences. //! //! Since the module split (see `docs/CHANGELOG_SETTINGS_SPLIT.md`), the //! handlers that were in `handlers::settings_handler` are distributed across //! `handlers::settings::profile`, `handlers::settings::security` and //! `handlers::settings::preferences`. Consumer apps must update their import //! paths accordingly. pub mod preferences; pub mod profile; pub mod security; use crate::dto::navigation_dto::NavigationDTO; /// Custom filters shared by Askama templates in settings pages. /// /// Exposed as `pub mod` so that the `Template` derive expansion in /// sub-modules can resolve `filters::default` / `filters::length` after /// a simple `use super::filters;` import. #[allow(dead_code, missing_docs)] pub mod filters { use askama::Result; /// Askama filter: returns `value` as a string, or `default_value` if it is empty. #[allow(dead_code)] #[askama::filter_fn] pub fn default<T: std::fmt::Display>( value: T, _values: &dyn askama::Values, default_value: &str, ) -> Result<String> { let value_str = value.to_string(); if value_str.is_empty() { Ok(default_value.to_string()) } else { Ok(value_str) } } /// Askama filter: returns the number of elements in an iterable. #[askama::filter_fn] pub fn length<I: IntoIterator>(value: I, _values: &dyn askama::Values) -> Result<usize> { Ok(value.into_iter().count()) } } /// Simplified navigation item for templates #[derive(Clone)] #[allow(dead_code)] pub(crate) struct NavItem { pub(crate) id: String, pub(crate) label: String, pub(crate) icon: String, pub(crate) url: String, pub(crate) active: bool, pub(crate) enabled: bool, pub(crate) badge: String, pub(crate) has_badge: bool, pub(crate) disabled_message: String, pub(crate) has_disabled_message: bool, } /// Helper to build NavItems from NavigationDTO pub(crate) fn build_nav_items_from_dto( navigation: &NavigationDTO, active_id: &str, ) -> Vec<NavItem> { navigation .items .iter() .map(|item| NavItem { id: item.id.clone(), label: item.label.clone(), icon: item.icon.clone(), url: item.url.clone(), active: item.id == active_id, enabled: item.enabled, badge: item.badge.clone(), has_badge: item.has_badge, disabled_message: item.disabled_message.clone(), has_disabled_message: item.has_disabled_message, }) .collect() }
GitRust