use leptos::prelude::*;
use orbital_macros::component_doc;
use orbital_theme::use_theme_options;
use crate::shared::{picker_style_sheet, range_field_root_classes, use_range_coordinator};
use crate::{use_datetime_locale, TimeField, TimeFieldAppearance, TimeFieldBind};
use super::field_types::{TimeRangeFieldAppearance, TimeRangeFieldBind};
#[component_doc(
category = "Calendar & Time",
preview_slug = "time-range-field",
preview_label = "Time Range Field",
preview_icon = icondata::AiFieldTimeOutlined,
)]
#[component]
pub fn TimeRangeField(
#[prop(optional, into)]
bind: TimeRangeFieldBind,
#[prop(optional, into)]
appearance: TimeRangeFieldAppearance,
#[prop(optional, into)]
class: MaybeProp<String>,
) -> impl IntoView {
let TimeRangeFieldBind { value, id, name } = bind;
let TimeRangeFieldAppearance {
format,
reference_date,
timezone,
minute_step,
disabled,
} = appearance;
let locale = use_datetime_locale();
let theme_options = use_theme_options();
let coordinator = use_range_coordinator(value);
let resolved_reference = Signal::derive(move || {
let explicit = reference_date.get();
if explicit.start_of_day() == locale.reference_date {
locale.reference_date
} else {
explicit
}
});
let field_appearance_start = TimeFieldAppearance {
format,
reference_date: resolved_reference,
timezone,
minute_step,
disabled,
};
let field_appearance_end = TimeFieldAppearance {
format,
reference_date: resolved_reference,
timezone,
minute_step,
disabled,
};
let root_class = move || {
let mut parts = vec![range_field_root_classes(
"orb-time-range-field",
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="">
<TimeField
bind=TimeFieldBind { value: coordinator.start.into(), id, name }
appearance=field_appearance_start
/>
<span class="orb-picker-range-field__separator">" – "</span>
<TimeField
bind=TimeFieldBind { value: coordinator.end.into(), ..Default::default() }
appearance=field_appearance_end
/>
</div>
}
}