use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
#[derive(Debug, Clone, PartialEq)]
pub type Calendar;
#[wasm_bindgen(constructor, js_namespace = FullCalendar, js_name = Calendar)]
pub fn new(calendar_element: &web_sys::Element, options: JsValue) -> Calendar;
#[wasm_bindgen(method, js_name = render)]
pub fn render(this: &Calendar);
#[wasm_bindgen(method, js_name = addEvent)]
fn add_event(this: &Calendar, event: JsValue);
#[wasm_bindgen(method, js_name = getEventById)]
pub fn get_event_by_id(this: &Calendar, id: &str) -> Option<super::CalendarEvent>;
#[wasm_bindgen(method, js_name = getEvents)]
pub fn get_events(this: &Calendar) -> Vec<super::CalendarEvent>;
#[wasm_bindgen(method, js_name = changeView)]
pub fn change_view(this: &Calendar, view: &str, date: &str);
#[wasm_bindgen(method, js_name = updateSize)]
pub fn update_size(this: &Calendar);
#[wasm_bindgen(method, js_name = batchRendering)]
pub fn batch_rendering(this: &Calendar, f: web_sys::js_sys::Function);
}
impl Calendar {
pub fn batch<F>(&self, f: F)
where
F: FnMut() + 'static,
{
let closure = Closure::once_into_js(f);
self.batch_rendering(closure.unchecked_into());
}
pub fn add_calendar_event(&self, event: crate::EventBuilder) -> Result<(), JsValue> {
self.add_event(event.build()?);
Ok(())
}
pub fn add_or_replace_event(&self, event: crate::EventBuilder) -> Result<(), JsValue> {
if let Some(id) = event.id.as_ref()
&& let Some(old_event) = self.get_event_by_id(id.as_str())
{
old_event.remove();
}
self.add_calendar_event(event)
}
pub fn remove_event(&self, id: &str) {
if let Some(event) = self.get_event_by_id(id) {
event.remove();
}
}
pub fn clear_events(&self) {
let events = self.get_events();
for event in events {
event.remove();
}
}
pub fn reload(&self) {
self.render();
}
pub fn update_view(&self, view_name: &crate::InitialView) {
let current_date = web_sys::js_sys::Date::new_0();
let date_str = current_date.to_iso_string().as_string().unwrap_or_default();
self.change_view(view_name.as_ref(), &date_str);
}
pub fn update_view_to_date(
&self,
view_name: &crate::InitialView,
date: &web_sys::js_sys::Date,
) {
let date_str = date.to_iso_string().as_string().unwrap_or_default();
self.change_view(view_name.as_ref(), &date_str);
}
#[must_use]
pub fn view(&self) -> Option<super::CalendarView> {
web_sys::js_sys::Reflect::get(self, &JsValue::from_str("view"))
.ok()
.map(|v| {
web_sys::wasm_bindgen::JsCast::unchecked_into::<super::CalendarView>(v)
})
}
}