use leptos::prelude::*;
use orbital_macros::component_doc;
use orbital_theme::use_theme_options;
use crate::building_blocks::{
DateTimeRangeField, DateTimeRangeFieldAppearance, DateTimeRangeFieldBind,
DateTimeRangePickerAppearance, DateTimeRangePickerBind,
};
use crate::pickers::DateTimePicker;
use crate::shared::{
datetime_range_picker_row_class, layout_root_classes, picker_style_sheet, use_range_coordinator,
};
use crate::{DateTimePickerAppearance, DateTimePickerBind};
#[component_doc(
category = "Calendar & Time",
preview_slug = "date-time-range-picker",
preview_label = "DateTime Range Picker",
preview_icon = icondata::AiCalendarOutlined,
)]
#[component]
pub fn DateTimeRangePicker(
#[prop(optional, into)]
bind: DateTimeRangePickerBind,
#[prop(optional, into)]
appearance: DateTimeRangePickerAppearance,
#[prop(optional, into)]
class: MaybeProp<String>,
) -> impl IntoView {
let DateTimeRangePickerBind { value, id, name } = bind;
let DateTimeRangePickerAppearance {
date_format,
time_format,
timezone,
disabled,
} = appearance;
let theme_options = use_theme_options();
let value_stored = StoredValue::new(value);
let coordinator = use_range_coordinator(value_stored.with_value(|v| v.clone()));
let field_bind = DateTimeRangeFieldBind {
value: value_stored.with_value(|v| v.clone()),
id,
name,
};
let field_appearance = DateTimeRangeFieldAppearance {
date_format,
time_format,
timezone,
disabled,
};
let picker_appearance_start = DateTimePickerAppearance {
date_format,
time_format,
timezone,
disabled,
..Default::default()
};
let picker_appearance_end = DateTimePickerAppearance {
date_format,
time_format,
timezone,
disabled,
..Default::default()
};
let root_class = move || {
let mut parts = vec![layout_root_classes(theme_options.get().density)];
if let Some(extra) = class.get() {
if !extra.is_empty() {
parts.push(extra);
}
}
parts.join(" ")
};
view! {
<style>{picker_style_sheet()}</style>
<div class=root_class data-orbital-picker="">
<DateTimeRangeField bind=field_bind appearance=field_appearance />
<div class=datetime_range_picker_row_class()>
<DateTimePicker
bind=DateTimePickerBind { value: coordinator.start.into(), id, name }
appearance=picker_appearance_start
/>
<DateTimePicker
bind=DateTimePickerBind { value: coordinator.end.into(), ..Default::default() }
appearance=picker_appearance_end
/>
</div>
</div>
}
}