Skip to main content

orbital_datatable/core/
chart_binding.rs

1use leptos::prelude::*;
2
3use crate::types::{ChartBinding, ColumnType, DataTableColumnDef};
4
5/// Derive suggested chart field keys from visible table columns.
6pub 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
24/// Provide [`ChartBinding`] to descendants (chart slots, dashboard panels).
25pub fn provide_chart_binding(binding: ChartBinding) {
26    provide_context(binding);
27}
28
29/// Read the nearest [`ChartBinding`] when [`DataTableFeatures::CHARTS_INTEGRATION`] is enabled.
30pub 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}