orbital_datatable/core/
chart_binding.rs1use leptos::prelude::*;
2
3use crate::types::{ChartBinding, ColumnType, DataTableColumnDef};
4
5pub fn derive_schema_hints(columns: &[DataTableColumnDef]) -> (Option<String>, Vec<String>) {
7 let x_field = columns
8 .iter()
9 .find(|c| {
10 matches!(
11 c.col_type,
12 ColumnType::Text | ColumnType::SingleSelect | ColumnType::Date
13 )
14 })
15 .map(|c| c.field.clone());
16 let y_fields = columns
17 .iter()
18 .filter(|c| c.col_type == ColumnType::Number)
19 .map(|c| c.field.clone())
20 .collect();
21 (x_field, y_fields)
22}
23
24pub fn provide_chart_binding(binding: ChartBinding) {
26 provide_context(binding);
27}
28
29pub fn use_chart_binding() -> Option<ChartBinding> {
31 use_context::<ChartBinding>()
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37 use crate::types::DataTableColumnDef;
38
39 #[test]
40 fn derive_schema_hints_picks_category_and_numeric_columns() {
41 let columns = vec![
42 DataTableColumnDef::new("name", "Name"),
43 DataTableColumnDef::new("score", "Score").with_col_type(ColumnType::Number),
44 DataTableColumnDef::new("notes", "Notes"),
45 ];
46 let (x, ys) = derive_schema_hints(&columns);
47 assert_eq!(x.as_deref(), Some("name"));
48 assert_eq!(ys, vec!["score".to_string()]);
49 }
50}