use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
#[derive(Debug, Serialize, Deserialize)]
pub struct JsonCfg {
pub site: SiteCfg,
#[serde(default)]
pub dashboard: DashboardCfg,
#[serde(default)]
pub raw_tables: IndexMap<String, RawTableCfg>,
#[serde(default)]
pub composite_tables: IndexMap<String, CompositeTableCfg>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SiteCfg {
pub theme: ThemeCfg,
#[serde(default)]
pub menu: MenuCfg,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ThemeCfg {
pub title: String,
pub logo: String,
pub login_banner: String,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct MenuCfg {
pub dashboard: MenuItemCfg,
pub raw_table: MenuItemCfg,
pub composite_table: MenuItemCfg,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct MenuItemCfg {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hidden: Option<bool>,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct DashboardCfg {
pub title: String,
#[serde(default)]
pub subtitle: String,
#[serde(default)]
pub info: Option<DashboardInfo>,
#[serde(default)]
pub row: Vec<DashboardRow>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DashboardInfo {
pub card: Vec<DashboardInfoCard>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DashboardInfoCard {
#[serde(default)]
pub title: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub link: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DashboardRow {
pub gutter: u32,
pub col: Vec<DashboardRowCol>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DashboardRowCol {
pub span: u32,
pub title: String,
pub chart: Option<DashboardChart>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DashboardChart {
chart: String,
kind: String,
timescale: Option<String>,
from_date: Option<String>,
to_date: Option<String>,
default_date_range: Option<String>,
x_axis_title: Option<String>,
y_axis_title: Option<String>,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct CompositeTableCfg {
pub parent: ParentTableCfg,
pub children: Vec<ChildTableCfg>,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ParentTableCfg {
pub name: String,
#[serde(flatten)]
pub parent_config: RawTableCfg,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ChildTableCfg {
pub relation: String,
#[serde(flatten)]
pub child_config: RawTableCfg,
}
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct RawTableCfg {
pub table: TableCfg,
pub filter: FilterCfg,
pub view: ViewCfg,
pub create: CreateCfg,
pub update: UpdateCfg,
pub delete: DeleteCfg,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct TableCfg {
pub all_columns: bool,
pub columns: Vec<ColumnCfg>,
pub hidden_columns: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_by: Option<ViewOrderByCfg>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub table_size: Option<TableSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
impl Default for TableCfg {
fn default() -> TableCfg {
TableCfg {
all_columns: true,
columns: Vec::new(),
hidden_columns: Vec::new(),
order_by: None,
page_size: None,
table_size: None,
title: None,
}
}
}
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct FilterCfg {
pub hidden_columns: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TableSize {
Large,
Middle,
Small,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ColumnCfg {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub field: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub relation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ellipsis: Option<bool>,
}
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct ViewCfg {}
#[derive(Debug, Serialize, Deserialize)]
pub struct ViewOrderByCfg {
pub field: String,
pub order: Order,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Order {
Asc,
Desc,
}
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct CreateCfg {
pub enable: bool,
pub hidden_columns: Vec<String>,
}
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct UpdateCfg {
pub enable: bool,
pub hidden_columns: Vec<String>,
pub readonly_columns: Vec<String>,
}
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct DeleteCfg {
pub enable: bool,
}