use perspective_client::config::*;
use crate::js::plugin::ViewConfigRequirements;
use crate::session::column_defaults_update::ViewConfigUpdateExt;
use crate::session::drag_drop_update::ViewConfigExt as DragDropExt;
use crate::session::metadata::SessionMetadataRc;
use crate::session::replace_expression_update::ViewConfigExt as ReplaceExprExt;
use crate::session::{TableErrorState, ViewStats};
use crate::utils::*;
#[derive(Clone, Debug, PartialEq, Default)]
pub enum TableLoadState {
#[default]
Loaded,
Loading,
}
#[derive(Clone, Debug, PartialEq, Default)]
pub struct SessionProps {
pub config: PtrEqRc<ViewConfig>,
pub stats: Option<ViewStats>,
pub has_table: Option<TableLoadState>,
pub error: Option<TableErrorState>,
pub title: Option<String>,
pub metadata: SessionMetadataRc,
}
impl SessionProps {
pub fn is_errored(&self) -> bool {
self.error.is_some()
}
pub fn is_reconnect(&self) -> bool {
self.error
.as_ref()
.map(|x| x.is_reconnect())
.unwrap_or_default()
}
pub fn is_column_active(&self, name: &str) -> bool {
self.config.columns.iter().any(|maybe_col| {
maybe_col
.as_ref()
.map(|col| col == name)
.unwrap_or_default()
}) || self.config.group_by.iter().any(|col| col == name)
|| self.config.split_by.iter().any(|col| col == name)
|| self.config.filter.iter().any(|col| col.column() == name)
|| self.config.sort.iter().any(|col| col.0 == name)
}
pub fn is_column_expression_in_use(&self, name: &str) -> bool {
self.config.is_column_expression_in_use(name)
}
fn all_columns(&self) -> Vec<String> {
self.metadata
.get_table_columns()
.into_iter()
.flatten()
.cloned()
.collect()
}
pub fn create_drag_drop_update(
&self,
column: String,
index: usize,
drop: DragTarget,
drag: DragEffect,
requirements: &ViewConfigRequirements,
) -> ViewConfigUpdate {
let col_type = self
.metadata
.get_column_table_type(column.as_str())
.unwrap();
self.config.create_drag_drop_update(
column,
col_type,
index,
drop,
drag,
requirements,
self.metadata.get_features().unwrap(),
)
}
pub fn set_update_column_defaults(
&self,
config_update: &mut ViewConfigUpdate,
requirements: &ViewConfigRequirements,
) {
config_update.set_update_column_defaults(
&self.metadata,
&self.all_columns().into_iter().map(Some).collect::<Vec<_>>(),
requirements,
)
}
pub fn create_replace_expression_update(
&self,
old_expr_name: &str,
new_expr: &Expression<'static>,
) -> ViewConfigUpdate {
let old_expr_val = self
.metadata
.get_expression_by_alias(old_expr_name)
.unwrap();
let old_expr = Expression::new(Some(old_expr_name.into()), old_expr_val.into());
self.config
.create_replace_expression_update(&old_expr, new_expr)
}
pub fn create_rename_expression_update(
&self,
old_expr_name: String,
new_expr_name: Option<String>,
) -> ViewConfigUpdate {
let old_expr_val = self
.metadata
.get_expression_by_alias(&old_expr_name)
.unwrap();
let old_expr = Expression::new(Some(old_expr_name.into()), old_expr_val.clone().into());
let new_expr = Expression::new(new_expr_name.map(|n| n.into()), old_expr_val.into());
self.config
.create_replace_expression_update(&old_expr, &new_expr)
}
}