yew-full-calendar 0.1.1

Yew component for fullcalendar
Documentation
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern "C" {
    /// The main calendar object
    #[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());
    }

    /// Adds a calendar event to the calendar
    ///
    /// # Errors
    ///
    /// Returns an error if the event is invalid
    pub fn add_calendar_event(&self, event: crate::EventBuilder) -> Result<(), JsValue> {
        self.add_event(event.build()?);
        Ok(())
    }

    /// Adds a calendar event to the calendar, replacing any existing event with the same id
    ///
    /// # Errors
    ///
    /// Returns an error if the event is invalid
    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();
        }
    }

    // View Management Methods
    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)
                //.inspect_err(|e| web_sys::console::error_1(&format!("{e:#?}").into()))
                // .ok()
            })
    }
}