use leptos::prelude::*;
use orbital_base_components::{FieldInjection, Rule};
use orbital_core_components::{
Calendar, CalendarAppearance, CalendarBind, CalendarChromeLabels, PickerShortcutsBar,
};
use orbital_macros::component_doc;
use orbital_theme::use_theme_options;
use crate::shared::{
layout_root_classes, picker_style_sheet, use_datetime_locale_strings,
PickerLayoutActionBarSlot, PickerLayoutToolbarSlot,
};
use super::field_types::{DateCalendarAppearance, DateCalendarBind};
#[component_doc(
category = "Calendar & Time",
preview_slug = "date-calendar",
preview_label = "Date Calendar",
preview_icon = icondata::AiCalendarOutlined,
)]
#[component]
pub fn DateCalendar(
#[prop(optional, into)]
bind: DateCalendarBind,
#[prop(optional, into)]
appearance: DateCalendarAppearance,
#[prop(optional, into)]
class: MaybeProp<String>,
#[prop(optional)]
picker_layout_toolbar_slot: Option<PickerLayoutToolbarSlot>,
#[prop(optional)]
picker_layout_action_bar_slot: Option<PickerLayoutActionBarSlot>,
) -> impl IntoView {
let DateCalendarBind {
value,
id,
name,
rules,
} = bind;
let DateCalendarAppearance {
timezone,
min_date,
max_date,
shortcuts,
disabled,
day,
} = appearance;
let toolbar_children = StoredValue::new(picker_layout_toolbar_slot.map(|slot| slot.children));
let action_bar_children =
StoredValue::new(picker_layout_action_bar_slot.map(|slot| slot.children));
let theme_options = use_theme_options();
let (resolved_id, resolved_name) = FieldInjection::use_id_and_name(id, name);
let _ = resolved_id;
let _ = resolved_name;
let value_stored = StoredValue::new(value);
let validate = Rule::validate(rules, value_stored, resolved_name);
Effect::new(move |_| {
let _ = value_stored.get_value().get();
validate.run(None);
});
let on_shortcut = Callback::new(move |dt: orbital_base_components::OrbitalDateTime| {
value_stored.with_value(|v| v.set(Some(dt.start_of_day())));
validate.run(None);
});
let chrome_labels = move || {
let strings = use_datetime_locale_strings();
CalendarChromeLabels {
weekday_short: strings.weekday_header_labels(),
today: strings.today_label,
previous_month: strings.previous_month_label,
next_month: strings.next_month_label,
}
};
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="">
{move || {
if let Some(children) = toolbar_children.get_value() {
let children = children.clone();
children().into_any()
} else {
().into_any()
}
}}
{move || {
if shortcuts.get().is_empty() {
().into_any()
} else {
view! {
<PickerShortcutsBar
shortcuts=shortcuts
disabled=disabled
on_select=on_shortcut
/>
}
.into_any()
}
}}
{move || {
view! {
<Calendar
bind=CalendarBind { value: value_stored.get_value() }
appearance=CalendarAppearance {
timezone: timezone.get(),
min_date: min_date.get(),
max_date: max_date.get(),
}
day=day.clone()
chrome_labels=chrome_labels()
/>
}
}}
{move || {
if let Some(children) = action_bar_children.get_value() {
let children = children.clone();
children().into_any()
} else {
().into_any()
}
}}
</div>
}
}