use perspective_client::config::GroupRollupMode;
use serde::Deserialize;
use ts_rs::TS;
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, TS)]
#[serde(rename_all = "camelCase")]
pub enum ColumnSelectMode {
#[default]
Toggle,
Select,
}
impl ColumnSelectMode {
pub fn css(&self) -> yew::Classes {
match self {
Self::Toggle => yew::classes!("toggle-mode", "is_column_active"),
Self::Select => yew::classes!("select-mode", "is_column_active"),
}
}
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, TS)]
pub struct PluginStaticConfig {
pub name: String,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub category: Option<String>,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub max_columns: Option<usize>,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub max_cells: Option<usize>,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub select_mode: ColumnSelectMode,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub min_config_columns: Option<usize>,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub config_column_names: Vec<String>,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub group_rollup_modes: Option<Vec<GroupRollupMode>>,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub priority: Option<i32>,
#[serde(default)]
#[ts(as = "Option<_>")]
#[ts(optional)]
pub can_render_column_styles: bool,
}
impl PluginStaticConfig {
pub fn is_swap(&self, index: usize) -> bool {
!self.config_column_names.is_empty() && index < self.config_column_names.len() - 1
}
pub fn get_group_rollups(&self, rollup_features: &[GroupRollupMode]) -> Vec<GroupRollupMode> {
self.group_rollup_modes
.clone()
.map(|x| {
x.into_iter()
.filter(|y| rollup_features.is_empty() || rollup_features.contains(y))
.collect()
})
.unwrap_or_default()
}
}