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>,
index: usize,
on_day_click: Option<Rc<dyn Fn(u32, bool)>>,
) -> VirtualNode {
let day_number: u32 = day.day;
let day_text: String = day_number.to_string();
let is_selected: bool = !day.muted && selected.get() == day_number;
let handler: Option<Rc<dyn Fn(Event)>> = match on_day_click {
Some(callback) => {
let callback: Rc<dyn Fn(u32, bool)> = Rc::clone(&callback);
let muted: bool = day.muted;
Some(Rc::new(move |_event: Event| {
callback(day_number, muted);
}))
}
None => on_calendar_day_click(selected, day_number),
};
html! {
button {
class: if day.muted {
c_euv_calendar_day_muted()
} else if is_selected {
c_euv_calendar_day_selected()
} else if day.today {
c_euv_calendar_day_today()
} else {
c_euv_calendar_day()
}
key: index.to_string()
onclick: handler
day_text
}
}
}
#[component]
pub fn euv_calendar(node: VirtualNode<EuvCalendarProps>) -> VirtualNode {
let EuvCalendarProps {
title,
weekdays,
days,
selected,
on_day_click,
}: 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()
.enumerate()
.map(
|(index, day): (usize, &calendar::view::r#struct::EuvCalendarDay)| {
calendar_day(*day, selected, index, on_day_click.clone())
},
)
.collect();
html! {
div {
class: c_euv_calendar()
if !title.is_empty() {
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);
}))
}