use leptos::callback::Callback;
use leptos::prelude::*;
use orbital_data::{ChartFieldBinding, Dataset};
use orbital_macros::component_doc;
use crate::context::ChartKind;
use crate::shared::{ChartContainer, ScatterPlot, VoronoiLayer};
use crate::{
AxisDef, ChartItemId, ChartMotion, FadeMode, GridConfig, HighlightMode, HighlightScope,
PlotInset, SeriesDef,
};
#[component_doc(
category = "Charts",
preview_slug = "scatter-chart",
preview_label = "Scatter Chart",
preview_icon = icondata::AiDotChartOutlined,
)]
#[component]
pub fn ScatterChart(
#[prop(optional)]
dataset: Option<Dataset>,
#[prop(optional, into)]
x_field: Option<String>,
#[prop(optional, into)]
y_field: Option<String>,
#[prop(optional, into)]
id_field: Option<String>,
#[prop(optional, into)]
z_field: Option<String>,
#[prop(optional)]
binding: Option<ChartFieldBinding>,
#[prop(optional)]
series: Option<Vec<SeriesDef>>,
#[prop(optional)]
x_axis: Option<Vec<AxisDef>>,
#[prop(optional)]
y_axis: Option<Vec<AxisDef>>,
#[prop(optional)]
width: Option<f64>,
#[prop(optional)]
height: Option<f64>,
#[prop(optional)]
margin: Option<PlotInset>,
#[prop(optional)]
grid: Option<GridConfig>,
#[prop(optional)]
skip_animation: Option<bool>,
#[prop(optional)]
motion: Option<ChartMotion>,
#[prop(default = 4.0)]
marker_size: f64,
#[prop(default = None)]
voronoi_max_radius: Option<f64>,
#[prop(default = false)]
disable_voronoi: bool,
#[prop(optional)]
highlight_scope: Option<HighlightScope>,
#[prop(optional)]
on_item_click: Option<Callback<(ChartItemId,), ()>>,
#[prop(optional, into)]
class: MaybeProp<String>,
) -> impl IntoView {
let binding = binding.or_else(|| {
x_field
.zip(y_field.clone())
.map(|(x, y)| ChartFieldBinding {
x_field: Some(x),
y_fields: vec![y],
id_field: id_field.clone(),
size_field: z_field.clone(),
..Default::default()
})
});
let w = width.unwrap_or(520.0);
let h = height.unwrap_or(320.0);
let grid = grid.or({
Some(GridConfig {
horizontal: true,
vertical: true,
})
});
let highlight = highlight_scope.or(Some(HighlightScope {
highlight: HighlightMode::Item,
fade: FadeMode::Global,
}));
view! {
<ChartContainer
class=class
dataset=dataset
binding=binding
series=series
x_axis=x_axis
y_axis=y_axis
width=Some(w)
height=Some(h)
margin=margin
grid=grid
skip_animation=skip_animation
motion=motion
chart_kind=ChartKind::Scatter
highlight_scope=highlight
on_item_click=on_item_click
>
<VoronoiLayer
voronoi_max_radius=voronoi_max_radius
disable_voronoi=disable_voronoi
/>
<ScatterPlot marker_size=marker_size disable_voronoi=disable_voronoi />
</ChartContainer>
}
}