use super::*;
fn calendar_weekday(weekday: EuvCalendarWeekday) -> VirtualNode {
let label: &'static str = match weekday {
EuvCalendarWeekday::Mon => "Mo",
EuvCalendarWeekday::Tue => "Tu",
EuvCalendarWeekday::Wed => "We",
EuvCalendarWeekday::Thu => "Th",
EuvCalendarWeekday::Fri => "Fr",
EuvCalendarWeekday::Sat => "Sa",
EuvCalendarWeekday::Sun => "Su",
};
html! {
div {
class: c_euv_calendar_weekday()
key: {
label
}
{
label
}
}
}
}
fn calendar_day(day: EuvCalendarDay, selected: Signal<u32>) -> VirtualNode {
let day_number: u32 = day.day;
let day_text: String = day_number.to_string();
let is_selected: bool = selected.get() == day_number;
let base_class: fn() -> &'static Css = if day.muted {
c_euv_calendar_day_muted
} else {
c_euv_calendar_day
};
html! {
button {
class: base_class()
class: if day.today {
c_euv_calendar_day_today()
} else {
c_euv_calendar_day()
}
class: if is_selected {
c_euv_calendar_day_selected()
} else {
c_euv_calendar_day()
}
key: {
day_number.to_string()
}
onclick: on_calendar_day_click(selected, day_number)
day_text
}
}
}
#[component]
pub fn euv_calendar(node: VirtualNode<EuvCalendarProps>) -> VirtualNode {
let EuvCalendarProps {
title,
weekdays,
days,
selected,
}: EuvCalendarProps = node.try_get_props().unwrap_or_default();
let weekday_nodes: Vec<VirtualNode> = weekdays
.iter()
.map(|weekday: &EuvCalendarWeekday| calendar_weekday(*weekday))
.collect();
let day_nodes: Vec<VirtualNode> = days
.iter()
.map(|day: &EuvCalendarDay| calendar_day(*day, selected))
.collect();
html! {
div {
class: c_euv_calendar()
div {
class: c_euv_calendar_header()
h3 {
class: c_euv_calendar_title()
title
}
div {
class: c_euv_calendar_nav()
button {
class: c_euv_calendar_day()
"‹"
}
button {
class: c_euv_calendar_day()
"›"
}
}
}
div {
class: c_euv_calendar_weekdays()
weekday_nodes
}
div {
class: c_euv_calendar_grid()
day_nodes
}
}
}
}
pub fn on_calendar_day_click(selected: Signal<u32>, day: u32) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |_: Event| {
selected.set(day);
}))
}