use crate::{AdminInstance, QuickAction, StatCard};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DashboardView {
pub title: String,
pub stats: Vec<StatCard>,
pub quick_actions: Vec<QuickAction>,
pub model_summaries: Vec<ModelSummary>,
}
impl DashboardView {
pub fn new(admin: &AdminInstance) -> Self {
let model_summaries = admin
.models()
.iter()
.map(|m| ModelSummary {
name: m.name.clone(),
verbose_name: m.verbose_name.clone(),
icon: m.icon.clone(),
count: 0, recent_count: 0,
url: format!("{}/{}", admin.config.base_path, m.name),
})
.collect();
Self {
title: admin.config.title.clone(),
stats: vec![StatCard {
title: "Total Records".to_string(),
value: "0".to_string(),
change: None,
icon: Some("database".to_string()),
color: None,
link: None,
}],
quick_actions: admin
.models()
.iter()
.filter(|m| m.can_add)
.take(4)
.map(|m| QuickAction {
label: format!("Add {}", m.verbose_name_singular),
url: format!("{}/{}/add", admin.config.base_path, m.name),
icon: Some("plus".to_string()),
css_class: None,
})
.collect(),
model_summaries,
}
}
pub fn with_stats(mut self, stats: Vec<StatCard>) -> Self {
self.stats = stats;
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelSummary {
pub name: String,
pub verbose_name: String,
pub icon: Option<String>,
pub count: usize,
pub recent_count: usize,
pub url: String,
}