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()
}